tc-h8300.c revision 1.1.1.5 1 1.1 skrll /* tc-h8300.c -- Assemble code for the Renesas H8/300
2 1.1.1.5 christos Copyright (C) 1991-2016 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 /* Written By Steve Chamberlain <sac (at) cygnus.com>. */
22 1.1 skrll
23 1.1 skrll #include "as.h"
24 1.1 skrll #include "subsegs.h"
25 1.1 skrll #include "dwarf2dbg.h"
26 1.1 skrll
27 1.1 skrll #define DEFINE_TABLE
28 1.1 skrll #define h8_opcodes ops
29 1.1 skrll #include "opcode/h8300.h"
30 1.1 skrll #include "safe-ctype.h"
31 1.1 skrll
32 1.1 skrll #ifdef OBJ_ELF
33 1.1 skrll #include "elf/h8.h"
34 1.1 skrll #endif
35 1.1 skrll
36 1.1 skrll const char comment_chars[] = ";";
37 1.1 skrll const char line_comment_chars[] = "#";
38 1.1.1.4 christos #ifdef TE_LINUX
39 1.1.1.4 christos const char line_separator_chars[] = "!";
40 1.1.1.4 christos #else
41 1.1 skrll const char line_separator_chars[] = "";
42 1.1.1.4 christos #endif
43 1.1 skrll
44 1.1 skrll static void sbranch (int);
45 1.1 skrll static void h8300hmode (int);
46 1.1 skrll static void h8300smode (int);
47 1.1 skrll static void h8300hnmode (int);
48 1.1 skrll static void h8300snmode (int);
49 1.1 skrll static void h8300sxmode (int);
50 1.1 skrll static void h8300sxnmode (int);
51 1.1 skrll static void pint (int);
52 1.1 skrll
53 1.1 skrll int Hmode;
54 1.1 skrll int Smode;
55 1.1 skrll int Nmode;
56 1.1 skrll int SXmode;
57 1.1 skrll
58 1.1.1.4 christos static int default_mach = bfd_mach_h8300;
59 1.1.1.4 christos
60 1.1 skrll #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
61 1.1 skrll
62 1.1 skrll static int bsize = L_8; /* Default branch displacement. */
63 1.1 skrll
64 1.1 skrll struct h8_instruction
65 1.1 skrll {
66 1.1 skrll int length;
67 1.1 skrll int noperands;
68 1.1 skrll int idx;
69 1.1 skrll int size;
70 1.1 skrll const struct h8_opcode *opcode;
71 1.1 skrll };
72 1.1 skrll
73 1.1 skrll static struct h8_instruction *h8_instructions;
74 1.1 skrll
75 1.1 skrll static void
76 1.1 skrll h8300hmode (int arg ATTRIBUTE_UNUSED)
77 1.1 skrll {
78 1.1 skrll Hmode = 1;
79 1.1 skrll Smode = 0;
80 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
81 1.1 skrll as_warn (_("could not set architecture and machine"));
82 1.1 skrll }
83 1.1 skrll
84 1.1 skrll static void
85 1.1 skrll h8300smode (int arg ATTRIBUTE_UNUSED)
86 1.1 skrll {
87 1.1 skrll Smode = 1;
88 1.1 skrll Hmode = 1;
89 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
90 1.1 skrll as_warn (_("could not set architecture and machine"));
91 1.1 skrll }
92 1.1 skrll
93 1.1 skrll static void
94 1.1 skrll h8300hnmode (int arg ATTRIBUTE_UNUSED)
95 1.1 skrll {
96 1.1 skrll Hmode = 1;
97 1.1 skrll Smode = 0;
98 1.1 skrll Nmode = 1;
99 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
100 1.1 skrll as_warn (_("could not set architecture and machine"));
101 1.1 skrll }
102 1.1 skrll
103 1.1 skrll static void
104 1.1 skrll h8300snmode (int arg ATTRIBUTE_UNUSED)
105 1.1 skrll {
106 1.1 skrll Smode = 1;
107 1.1 skrll Hmode = 1;
108 1.1 skrll Nmode = 1;
109 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
110 1.1 skrll as_warn (_("could not set architecture and machine"));
111 1.1 skrll }
112 1.1 skrll
113 1.1 skrll static void
114 1.1 skrll h8300sxmode (int arg ATTRIBUTE_UNUSED)
115 1.1 skrll {
116 1.1 skrll Smode = 1;
117 1.1 skrll Hmode = 1;
118 1.1 skrll SXmode = 1;
119 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
120 1.1 skrll as_warn (_("could not set architecture and machine"));
121 1.1 skrll }
122 1.1 skrll
123 1.1 skrll static void
124 1.1 skrll h8300sxnmode (int arg ATTRIBUTE_UNUSED)
125 1.1 skrll {
126 1.1 skrll Smode = 1;
127 1.1 skrll Hmode = 1;
128 1.1 skrll SXmode = 1;
129 1.1 skrll Nmode = 1;
130 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
131 1.1 skrll as_warn (_("could not set architecture and machine"));
132 1.1 skrll }
133 1.1 skrll
134 1.1 skrll static void
135 1.1 skrll sbranch (int size)
136 1.1 skrll {
137 1.1 skrll bsize = size;
138 1.1 skrll }
139 1.1 skrll
140 1.1 skrll static void
141 1.1 skrll pint (int arg ATTRIBUTE_UNUSED)
142 1.1 skrll {
143 1.1 skrll cons (Hmode ? 4 : 2);
144 1.1 skrll }
145 1.1 skrll
146 1.1.1.2 christos /* Like obj_elf_section, but issues a warning for new
147 1.1.1.2 christos sections which do not have an attribute specification. */
148 1.1.1.2 christos
149 1.1.1.2 christos static void
150 1.1.1.2 christos h8300_elf_section (int push)
151 1.1.1.2 christos {
152 1.1.1.2 christos static const char * known_data_sections [] = { ".rodata", ".tdata", ".tbss" };
153 1.1.1.2 christos static const char * known_data_prefixes [] = { ".debug", ".zdebug", ".gnu.warning" };
154 1.1.1.2 christos char * saved_ilp = input_line_pointer;
155 1.1.1.5 christos const char * name;
156 1.1.1.2 christos
157 1.1.1.2 christos name = obj_elf_section_name ();
158 1.1.1.2 christos if (name == NULL)
159 1.1.1.2 christos return;
160 1.1.1.2 christos
161 1.1.1.2 christos if (* input_line_pointer != ','
162 1.1.1.2 christos && bfd_get_section_by_name (stdoutput, name) == NULL)
163 1.1.1.2 christos {
164 1.1.1.2 christos signed int i;
165 1.1.1.2 christos
166 1.1.1.2 christos /* Ignore this warning for well known data sections. */
167 1.1.1.2 christos for (i = ARRAY_SIZE (known_data_sections); i--;)
168 1.1.1.2 christos if (strcmp (name, known_data_sections[i]) == 0)
169 1.1.1.2 christos break;
170 1.1.1.2 christos
171 1.1.1.2 christos if (i < 0)
172 1.1.1.2 christos for (i = ARRAY_SIZE (known_data_prefixes); i--;)
173 1.1.1.2 christos if (strncmp (name, known_data_prefixes[i],
174 1.1.1.2 christos strlen (known_data_prefixes[i])) == 0)
175 1.1.1.2 christos break;
176 1.1.1.2 christos
177 1.1.1.2 christos if (i < 0)
178 1.1.1.2 christos as_warn (_("new section '%s' defined without attributes - this might cause problems"), name);
179 1.1.1.2 christos }
180 1.1.1.2 christos
181 1.1.1.2 christos /* FIXME: We ought to free the memory allocated by obj_elf_section_name()
182 1.1.1.2 christos for 'name', but we do not know if it was taken from the obstack, via
183 1.1.1.2 christos demand_copy_C_string(), or xmalloc()ed. */
184 1.1.1.2 christos input_line_pointer = saved_ilp;
185 1.1.1.2 christos obj_elf_section (push);
186 1.1.1.2 christos }
187 1.1.1.2 christos
188 1.1 skrll /* This table describes all the machine specific pseudo-ops the assembler
189 1.1 skrll has to support. The fields are:
190 1.1 skrll pseudo-op name without dot
191 1.1 skrll function to call to execute this pseudo-op
192 1.1 skrll Integer arg to pass to the function. */
193 1.1 skrll
194 1.1 skrll const pseudo_typeS md_pseudo_table[] =
195 1.1 skrll {
196 1.1 skrll {"h8300h", h8300hmode, 0},
197 1.1 skrll {"h8300hn", h8300hnmode, 0},
198 1.1 skrll {"h8300s", h8300smode, 0},
199 1.1 skrll {"h8300sn", h8300snmode, 0},
200 1.1 skrll {"h8300sx", h8300sxmode, 0},
201 1.1 skrll {"h8300sxn", h8300sxnmode, 0},
202 1.1 skrll {"sbranch", sbranch, L_8},
203 1.1 skrll {"lbranch", sbranch, L_16},
204 1.1 skrll
205 1.1 skrll {"int", pint, 0},
206 1.1 skrll {"data.b", cons, 1},
207 1.1 skrll {"data.w", cons, 2},
208 1.1 skrll {"data.l", cons, 4},
209 1.1 skrll {"form", listing_psize, 0},
210 1.1 skrll {"heading", listing_title, 0},
211 1.1 skrll {"import", s_ignore, 0},
212 1.1 skrll {"page", listing_eject, 0},
213 1.1 skrll {"program", s_ignore, 0},
214 1.1.1.2 christos
215 1.1.1.2 christos #ifdef OBJ_ELF
216 1.1.1.2 christos {"section", h8300_elf_section, 0},
217 1.1.1.2 christos {"section.s", h8300_elf_section, 0},
218 1.1.1.2 christos {"sect", h8300_elf_section, 0},
219 1.1.1.2 christos {"sect.s", h8300_elf_section, 0},
220 1.1.1.2 christos #endif
221 1.1.1.2 christos
222 1.1 skrll {0, 0, 0}
223 1.1 skrll };
224 1.1 skrll
225 1.1 skrll const char EXP_CHARS[] = "eE";
226 1.1 skrll
227 1.1 skrll /* Chars that mean this number is a floating point constant
228 1.1 skrll As in 0f12.456
229 1.1 skrll or 0d1.2345e12. */
230 1.1 skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
231 1.1 skrll
232 1.1 skrll static struct hash_control *opcode_hash_control; /* Opcode mnemonics. */
233 1.1 skrll
234 1.1 skrll /* This function is called once, at assembler startup time. This
235 1.1 skrll should set up all the tables, etc. that the MD part of the assembler
236 1.1 skrll needs. */
237 1.1 skrll
238 1.1 skrll void
239 1.1 skrll md_begin (void)
240 1.1 skrll {
241 1.1 skrll unsigned int nopcodes;
242 1.1 skrll struct h8_opcode *p, *p1;
243 1.1 skrll struct h8_instruction *pi;
244 1.1 skrll char prev_buffer[100];
245 1.1 skrll int idx = 0;
246 1.1 skrll
247 1.1.1.4 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, default_mach))
248 1.1 skrll as_warn (_("could not set architecture and machine"));
249 1.1 skrll
250 1.1 skrll opcode_hash_control = hash_new ();
251 1.1 skrll prev_buffer[0] = 0;
252 1.1 skrll
253 1.1 skrll nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
254 1.1.1.4 christos
255 1.1.1.5 christos h8_instructions = XNEWVEC (struct h8_instruction, nopcodes);
256 1.1 skrll
257 1.1 skrll pi = h8_instructions;
258 1.1 skrll p1 = h8_opcodes;
259 1.1 skrll /* We do a minimum amount of sorting on the opcode table; this is to
260 1.1 skrll make it easy to describe the mova instructions without unnecessary
261 1.1 skrll code duplication.
262 1.1 skrll Sorting only takes place inside blocks of instructions of the form
263 1.1 skrll X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */
264 1.1 skrll while (p1)
265 1.1 skrll {
266 1.1 skrll struct h8_opcode *first_skipped = 0;
267 1.1 skrll int len, cmplen = 0;
268 1.1.1.5 christos const char *src = p1->name;
269 1.1 skrll char *dst, *buffer;
270 1.1 skrll
271 1.1 skrll if (p1->name == 0)
272 1.1 skrll break;
273 1.1 skrll /* Strip off any . part when inserting the opcode and only enter
274 1.1 skrll unique codes into the hash table. */
275 1.1.1.5 christos dst = buffer = XNEWVEC (char, strlen (src) + 1);
276 1.1 skrll while (*src)
277 1.1 skrll {
278 1.1 skrll if (*src == '.')
279 1.1 skrll {
280 1.1 skrll src++;
281 1.1 skrll break;
282 1.1 skrll }
283 1.1 skrll if (*src == '/')
284 1.1 skrll cmplen = src - p1->name + 1;
285 1.1 skrll *dst++ = *src++;
286 1.1 skrll }
287 1.1 skrll *dst = 0;
288 1.1 skrll len = dst - buffer;
289 1.1 skrll if (cmplen == 0)
290 1.1 skrll cmplen = len;
291 1.1 skrll hash_insert (opcode_hash_control, buffer, (char *) pi);
292 1.1 skrll strcpy (prev_buffer, buffer);
293 1.1 skrll idx++;
294 1.1 skrll
295 1.1 skrll for (p = p1; p->name; p++)
296 1.1 skrll {
297 1.1 skrll /* A negative TIME is used to indicate that we've added this opcode
298 1.1 skrll already. */
299 1.1 skrll if (p->time == -1)
300 1.1 skrll continue;
301 1.1 skrll if (strncmp (p->name, buffer, cmplen) != 0
302 1.1 skrll || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
303 1.1 skrll && p->name[cmplen - 1] != '/'))
304 1.1 skrll {
305 1.1 skrll if (first_skipped == 0)
306 1.1 skrll first_skipped = p;
307 1.1 skrll break;
308 1.1 skrll }
309 1.1 skrll if (strncmp (p->name, buffer, len) != 0)
310 1.1 skrll {
311 1.1 skrll if (first_skipped == 0)
312 1.1 skrll first_skipped = p;
313 1.1 skrll continue;
314 1.1 skrll }
315 1.1 skrll
316 1.1 skrll p->time = -1;
317 1.1 skrll pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
318 1.1 skrll pi->idx = idx;
319 1.1 skrll
320 1.1 skrll /* Find the number of operands. */
321 1.1 skrll pi->noperands = 0;
322 1.1 skrll while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
323 1.1 skrll pi->noperands++;
324 1.1 skrll
325 1.1 skrll /* Find the length of the opcode in bytes. */
326 1.1 skrll pi->length = 0;
327 1.1 skrll while (p->data.nib[pi->length * 2] != (op_type) E)
328 1.1 skrll pi->length++;
329 1.1 skrll
330 1.1 skrll pi->opcode = p;
331 1.1 skrll pi++;
332 1.1 skrll }
333 1.1 skrll p1 = first_skipped;
334 1.1 skrll }
335 1.1 skrll
336 1.1 skrll /* Add entry for the NULL vector terminator. */
337 1.1 skrll pi->length = 0;
338 1.1 skrll pi->noperands = 0;
339 1.1 skrll pi->idx = 0;
340 1.1 skrll pi->size = 0;
341 1.1 skrll pi->opcode = 0;
342 1.1 skrll
343 1.1 skrll linkrelax = 1;
344 1.1 skrll }
345 1.1 skrll
346 1.1 skrll struct h8_op
347 1.1 skrll {
348 1.1 skrll op_type mode;
349 1.1 skrll unsigned reg;
350 1.1 skrll expressionS exp;
351 1.1 skrll };
352 1.1 skrll
353 1.1 skrll static void clever_message (const struct h8_instruction *, struct h8_op *);
354 1.1 skrll static void fix_operand_size (struct h8_op *, int);
355 1.1 skrll static void build_bytes (const struct h8_instruction *, struct h8_op *);
356 1.1.1.2 christos static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *);
357 1.1.1.5 christos static void check_operand (struct h8_op *, unsigned int, const char *);
358 1.1 skrll static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
359 1.1 skrll static char *get_operands (unsigned, char *, struct h8_op *);
360 1.1 skrll static void get_operand (char **, struct h8_op *, int);
361 1.1 skrll static int parse_reg (char *, op_type *, unsigned *, int);
362 1.1 skrll static char *skip_colonthing (char *, int *);
363 1.1 skrll static char *parse_exp (char *, struct h8_op *);
364 1.1 skrll
365 1.1 skrll static int constant_fits_size_p (struct h8_op *, int, int);
366 1.1 skrll
367 1.1 skrll /*
368 1.1 skrll parse operands
369 1.1 skrll WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
370 1.1 skrll r0l,r0h,..r7l,r7h
371 1.1 skrll @WREG
372 1.1 skrll @WREG+
373 1.1 skrll @-WREG
374 1.1 skrll #const
375 1.1 skrll ccr
376 1.1 skrll */
377 1.1 skrll
378 1.1 skrll /* Try to parse a reg name. Return the number of chars consumed. */
379 1.1 skrll
380 1.1 skrll static int
381 1.1 skrll parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
382 1.1 skrll {
383 1.1 skrll char *end;
384 1.1 skrll int len;
385 1.1 skrll
386 1.1.1.4 christos /* Cribbed from get_symbol_name. */
387 1.1 skrll if (!is_name_beginner (*src) || *src == '\001')
388 1.1 skrll return 0;
389 1.1 skrll end = src + 1;
390 1.1 skrll while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
391 1.1 skrll end++;
392 1.1 skrll len = end - src;
393 1.1 skrll
394 1.1 skrll if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
395 1.1 skrll {
396 1.1 skrll *mode = PSIZE | REG | direction;
397 1.1 skrll *reg = 7;
398 1.1 skrll return len;
399 1.1 skrll }
400 1.1.1.4 christos if (len == 3 &&
401 1.1.1.4 christos TOLOWER (src[0]) == 'c' &&
402 1.1.1.4 christos TOLOWER (src[1]) == 'c' &&
403 1.1 skrll TOLOWER (src[2]) == 'r')
404 1.1 skrll {
405 1.1 skrll *mode = CCR;
406 1.1 skrll *reg = 0;
407 1.1 skrll return len;
408 1.1 skrll }
409 1.1.1.4 christos if (len == 3 &&
410 1.1.1.4 christos TOLOWER (src[0]) == 'e' &&
411 1.1.1.4 christos TOLOWER (src[1]) == 'x' &&
412 1.1 skrll TOLOWER (src[2]) == 'r')
413 1.1 skrll {
414 1.1 skrll *mode = EXR;
415 1.1 skrll *reg = 1;
416 1.1 skrll return len;
417 1.1 skrll }
418 1.1.1.4 christos if (len == 3 &&
419 1.1.1.4 christos TOLOWER (src[0]) == 'v' &&
420 1.1.1.4 christos TOLOWER (src[1]) == 'b' &&
421 1.1 skrll TOLOWER (src[2]) == 'r')
422 1.1 skrll {
423 1.1 skrll *mode = VBR;
424 1.1 skrll *reg = 6;
425 1.1 skrll return len;
426 1.1 skrll }
427 1.1.1.4 christos if (len == 3 &&
428 1.1.1.4 christos TOLOWER (src[0]) == 's' &&
429 1.1.1.4 christos TOLOWER (src[1]) == 'b' &&
430 1.1 skrll TOLOWER (src[2]) == 'r')
431 1.1 skrll {
432 1.1 skrll *mode = SBR;
433 1.1 skrll *reg = 7;
434 1.1 skrll return len;
435 1.1 skrll }
436 1.1 skrll if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
437 1.1 skrll {
438 1.1 skrll *mode = PSIZE | REG | direction;
439 1.1 skrll *reg = 6;
440 1.1 skrll return len;
441 1.1 skrll }
442 1.1 skrll if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
443 1.1 skrll src[2] >= '0' && src[2] <= '7')
444 1.1 skrll {
445 1.1 skrll *mode = L_32 | REG | direction;
446 1.1 skrll *reg = src[2] - '0';
447 1.1 skrll if (!Hmode)
448 1.1 skrll as_warn (_("Reg not valid for H8/300"));
449 1.1 skrll return len;
450 1.1 skrll }
451 1.1 skrll if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
452 1.1 skrll {
453 1.1 skrll *mode = L_16 | REG | direction;
454 1.1 skrll *reg = src[1] - '0' + 8;
455 1.1 skrll if (!Hmode)
456 1.1 skrll as_warn (_("Reg not valid for H8/300"));
457 1.1 skrll return len;
458 1.1 skrll }
459 1.1 skrll
460 1.1 skrll if (TOLOWER (src[0]) == 'r')
461 1.1 skrll {
462 1.1 skrll if (src[1] >= '0' && src[1] <= '7')
463 1.1 skrll {
464 1.1 skrll if (len == 3 && TOLOWER (src[2]) == 'l')
465 1.1 skrll {
466 1.1 skrll *mode = L_8 | REG | direction;
467 1.1 skrll *reg = (src[1] - '0') + 8;
468 1.1 skrll return len;
469 1.1 skrll }
470 1.1 skrll if (len == 3 && TOLOWER (src[2]) == 'h')
471 1.1 skrll {
472 1.1 skrll *mode = L_8 | REG | direction;
473 1.1 skrll *reg = (src[1] - '0');
474 1.1 skrll return len;
475 1.1 skrll }
476 1.1 skrll if (len == 2)
477 1.1 skrll {
478 1.1 skrll *mode = L_16 | REG | direction;
479 1.1 skrll *reg = (src[1] - '0');
480 1.1 skrll return len;
481 1.1 skrll }
482 1.1 skrll }
483 1.1 skrll }
484 1.1 skrll
485 1.1 skrll return 0;
486 1.1 skrll }
487 1.1 skrll
488 1.1 skrll
489 1.1 skrll /* Parse an immediate or address-related constant and store it in OP.
490 1.1 skrll If the user also specifies the operand's size, store that size
491 1.1 skrll in OP->MODE, otherwise leave it for later code to decide. */
492 1.1 skrll
493 1.1 skrll static char *
494 1.1 skrll parse_exp (char *src, struct h8_op *op)
495 1.1 skrll {
496 1.1 skrll char *save;
497 1.1 skrll
498 1.1 skrll save = input_line_pointer;
499 1.1 skrll input_line_pointer = src;
500 1.1 skrll expression (&op->exp);
501 1.1 skrll if (op->exp.X_op == O_absent)
502 1.1 skrll as_bad (_("missing operand"));
503 1.1 skrll src = input_line_pointer;
504 1.1 skrll input_line_pointer = save;
505 1.1 skrll
506 1.1 skrll return skip_colonthing (src, &op->mode);
507 1.1 skrll }
508 1.1 skrll
509 1.1 skrll
510 1.1 skrll /* If SRC starts with an explicit operand size, skip it and store the size
511 1.1 skrll in *MODE. Leave *MODE unchanged otherwise. */
512 1.1 skrll
513 1.1 skrll static char *
514 1.1 skrll skip_colonthing (char *src, int *mode)
515 1.1 skrll {
516 1.1 skrll if (*src == ':')
517 1.1 skrll {
518 1.1 skrll src++;
519 1.1 skrll *mode &= ~SIZE;
520 1.1 skrll if (src[0] == '8' && !ISDIGIT (src[1]))
521 1.1 skrll *mode |= L_8;
522 1.1 skrll else if (src[0] == '2' && !ISDIGIT (src[1]))
523 1.1 skrll *mode |= L_2;
524 1.1 skrll else if (src[0] == '3' && !ISDIGIT (src[1]))
525 1.1 skrll *mode |= L_3;
526 1.1 skrll else if (src[0] == '4' && !ISDIGIT (src[1]))
527 1.1 skrll *mode |= L_4;
528 1.1 skrll else if (src[0] == '5' && !ISDIGIT (src[1]))
529 1.1 skrll *mode |= L_5;
530 1.1 skrll else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
531 1.1 skrll *mode |= L_24;
532 1.1 skrll else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
533 1.1 skrll *mode |= L_32;
534 1.1 skrll else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
535 1.1 skrll *mode |= L_16;
536 1.1 skrll else
537 1.1 skrll as_bad (_("invalid operand size requested"));
538 1.1 skrll
539 1.1 skrll while (ISDIGIT (*src))
540 1.1 skrll src++;
541 1.1 skrll }
542 1.1 skrll return src;
543 1.1 skrll }
544 1.1 skrll
545 1.1 skrll /* The many forms of operand:
546 1.1 skrll
547 1.1 skrll Rn Register direct
548 1.1 skrll @Rn Register indirect
549 1.1 skrll @(exp[:16], Rn) Register indirect with displacement
550 1.1 skrll @Rn+
551 1.1 skrll @-Rn
552 1.1 skrll @aa:8 absolute 8 bit
553 1.1 skrll @aa:16 absolute 16 bit
554 1.1 skrll @aa absolute 16 bit
555 1.1 skrll
556 1.1 skrll #xx[:size] immediate data
557 1.1 skrll @(exp:[8], pc) pc rel
558 1.1 skrll @@aa[:8] memory indirect. */
559 1.1 skrll
560 1.1 skrll static int
561 1.1.1.3 christos constant_fits_width_p (struct h8_op *operand, offsetT width)
562 1.1 skrll {
563 1.1.1.3 christos offsetT num;
564 1.1.1.3 christos
565 1.1.1.3 christos num = ((operand->exp.X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000;
566 1.1.1.3 christos return (num & ~width) == 0 || (num | width) == ~0;
567 1.1 skrll }
568 1.1 skrll
569 1.1 skrll static int
570 1.1 skrll constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
571 1.1 skrll {
572 1.1.1.3 christos offsetT num;
573 1.1.1.3 christos
574 1.1 skrll if (no_symbols
575 1.1 skrll && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
576 1.1 skrll return 0;
577 1.1.1.3 christos num = operand->exp.X_add_number & 0xffffffff;
578 1.1 skrll switch (size)
579 1.1 skrll {
580 1.1 skrll case L_2:
581 1.1 skrll return (num & ~3) == 0;
582 1.1 skrll case L_3:
583 1.1 skrll return (num & ~7) == 0;
584 1.1 skrll case L_3NZ:
585 1.1 skrll return num >= 1 && num < 8;
586 1.1 skrll case L_4:
587 1.1 skrll return (num & ~15) == 0;
588 1.1 skrll case L_5:
589 1.1 skrll return num >= 1 && num < 32;
590 1.1 skrll case L_8:
591 1.1.1.3 christos num = (num ^ 0x80000000) - 0x80000000;
592 1.1.1.3 christos return (num & ~0xFF) == 0 || (num | 0x7F) == ~0;
593 1.1 skrll case L_8U:
594 1.1 skrll return (num & ~0xFF) == 0;
595 1.1 skrll case L_16:
596 1.1.1.3 christos num = (num ^ 0x80000000) - 0x80000000;
597 1.1.1.3 christos return (num & ~0xFFFF) == 0 || (num | 0x7FFF) == ~0;
598 1.1 skrll case L_16U:
599 1.1 skrll return (num & ~0xFFFF) == 0;
600 1.1 skrll case L_32:
601 1.1 skrll return 1;
602 1.1 skrll default:
603 1.1 skrll abort ();
604 1.1 skrll }
605 1.1 skrll }
606 1.1 skrll
607 1.1 skrll static void
608 1.1 skrll get_operand (char **ptr, struct h8_op *op, int direction)
609 1.1 skrll {
610 1.1 skrll char *src = *ptr;
611 1.1 skrll op_type mode;
612 1.1 skrll unsigned int num;
613 1.1 skrll unsigned int len;
614 1.1 skrll
615 1.1 skrll op->mode = 0;
616 1.1 skrll
617 1.1 skrll /* Check for '(' and ')' for instructions ldm and stm. */
618 1.1 skrll if (src[0] == '(' && src[8] == ')')
619 1.1 skrll ++ src;
620 1.1 skrll
621 1.1 skrll /* Gross. Gross. ldm and stm have a format not easily handled
622 1.1 skrll by get_operand. We deal with it explicitly here. */
623 1.1.1.4 christos if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
624 1.1 skrll ISDIGIT (src[2]) && src[3] == '-' &&
625 1.1 skrll TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
626 1.1 skrll {
627 1.1 skrll int low, high;
628 1.1 skrll
629 1.1 skrll low = src[2] - '0';
630 1.1 skrll high = src[6] - '0';
631 1.1 skrll
632 1.1 skrll /* Check register pair's validity as per tech note TN-H8*-193A/E
633 1.1 skrll from Renesas for H8S and H8SX hardware manual. */
634 1.1 skrll if ( !(low == 0 && (high == 1 || high == 2 || high == 3))
635 1.1 skrll && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
636 1.1 skrll && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
637 1.1 skrll && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
638 1.1 skrll && !(low == 4 && (high == 5 || high == 6))
639 1.1 skrll && !(low == 4 && high == 7 && SXmode)
640 1.1 skrll && !(low == 5 && (high == 6 || high == 7) && SXmode)
641 1.1 skrll && !(low == 6 && high == 7 && SXmode))
642 1.1 skrll as_bad (_("Invalid register list for ldm/stm\n"));
643 1.1 skrll
644 1.1 skrll /* Even sicker. We encode two registers into op->reg. One
645 1.1 skrll for the low register to save, the other for the high
646 1.1 skrll register to save; we also set the high bit in op->reg
647 1.1 skrll so we know this is "very special". */
648 1.1 skrll op->reg = 0x80000000 | (high << 8) | low;
649 1.1 skrll op->mode = REG;
650 1.1 skrll if (src[7] == ')')
651 1.1 skrll *ptr = src + 8;
652 1.1 skrll else
653 1.1 skrll *ptr = src + 7;
654 1.1 skrll return;
655 1.1 skrll }
656 1.1 skrll
657 1.1 skrll len = parse_reg (src, &op->mode, &op->reg, direction);
658 1.1 skrll if (len)
659 1.1 skrll {
660 1.1 skrll src += len;
661 1.1 skrll if (*src == '.')
662 1.1 skrll {
663 1.1 skrll int size = op->mode & SIZE;
664 1.1 skrll switch (src[1])
665 1.1 skrll {
666 1.1 skrll case 'l': case 'L':
667 1.1 skrll if (size != L_32)
668 1.1 skrll as_warn (_("mismatch between register and suffix"));
669 1.1 skrll op->mode = (op->mode & ~MODE) | LOWREG;
670 1.1 skrll break;
671 1.1 skrll case 'w': case 'W':
672 1.1 skrll if (size != L_32 && size != L_16)
673 1.1 skrll as_warn (_("mismatch between register and suffix"));
674 1.1 skrll op->mode = (op->mode & ~MODE) | LOWREG;
675 1.1 skrll op->mode = (op->mode & ~SIZE) | L_16;
676 1.1 skrll break;
677 1.1 skrll case 'b': case 'B':
678 1.1 skrll op->mode = (op->mode & ~MODE) | LOWREG;
679 1.1 skrll if (size != L_32 && size != L_8)
680 1.1 skrll as_warn (_("mismatch between register and suffix"));
681 1.1 skrll op->mode = (op->mode & ~MODE) | LOWREG;
682 1.1 skrll op->mode = (op->mode & ~SIZE) | L_8;
683 1.1 skrll break;
684 1.1 skrll default:
685 1.1.1.2 christos as_warn (_("invalid suffix after register."));
686 1.1 skrll break;
687 1.1 skrll }
688 1.1 skrll src += 2;
689 1.1 skrll }
690 1.1 skrll *ptr = src;
691 1.1 skrll return;
692 1.1 skrll }
693 1.1 skrll
694 1.1 skrll if (*src == '@')
695 1.1 skrll {
696 1.1 skrll src++;
697 1.1 skrll if (*src == '@')
698 1.1 skrll {
699 1.1 skrll *ptr = parse_exp (src + 1, op);
700 1.1 skrll if (op->exp.X_add_number >= 0x100)
701 1.1 skrll {
702 1.1 skrll int divisor = 1;
703 1.1 skrll
704 1.1 skrll op->mode = VECIND;
705 1.1 skrll /* FIXME : 2? or 4? */
706 1.1 skrll if (op->exp.X_add_number >= 0x400)
707 1.1 skrll as_bad (_("address too high for vector table jmp/jsr"));
708 1.1 skrll else if (op->exp.X_add_number >= 0x200)
709 1.1 skrll divisor = 4;
710 1.1 skrll else
711 1.1 skrll divisor = 2;
712 1.1 skrll
713 1.1 skrll op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
714 1.1 skrll }
715 1.1 skrll else
716 1.1 skrll op->mode = MEMIND;
717 1.1 skrll return;
718 1.1 skrll }
719 1.1 skrll
720 1.1 skrll if (*src == '-' || *src == '+')
721 1.1 skrll {
722 1.1 skrll len = parse_reg (src + 1, &mode, &num, direction);
723 1.1 skrll if (len == 0)
724 1.1 skrll {
725 1.1 skrll /* Oops, not a reg after all, must be ordinary exp. */
726 1.1 skrll op->mode = ABS | direction;
727 1.1 skrll *ptr = parse_exp (src, op);
728 1.1 skrll return;
729 1.1 skrll }
730 1.1 skrll
731 1.1 skrll if (((mode & SIZE) != PSIZE)
732 1.1 skrll /* For Normal mode accept 16 bit and 32 bit pointer registers. */
733 1.1 skrll && (!Nmode || ((mode & SIZE) != L_32)))
734 1.1 skrll as_bad (_("Wrong size pointer register for architecture."));
735 1.1 skrll
736 1.1 skrll op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
737 1.1 skrll op->reg = num;
738 1.1 skrll *ptr = src + 1 + len;
739 1.1 skrll return;
740 1.1 skrll }
741 1.1 skrll if (*src == '(')
742 1.1 skrll {
743 1.1 skrll src++;
744 1.1 skrll
745 1.1 skrll /* See if this is @(ERn.x, PC). */
746 1.1 skrll len = parse_reg (src, &mode, &op->reg, direction);
747 1.1 skrll if (len != 0 && (mode & MODE) == REG && src[len] == '.')
748 1.1 skrll {
749 1.1 skrll switch (TOLOWER (src[len + 1]))
750 1.1 skrll {
751 1.1 skrll case 'b':
752 1.1 skrll mode = PCIDXB | direction;
753 1.1 skrll break;
754 1.1 skrll case 'w':
755 1.1 skrll mode = PCIDXW | direction;
756 1.1 skrll break;
757 1.1 skrll case 'l':
758 1.1 skrll mode = PCIDXL | direction;
759 1.1 skrll break;
760 1.1 skrll default:
761 1.1 skrll mode = 0;
762 1.1 skrll break;
763 1.1 skrll }
764 1.1 skrll if (mode
765 1.1 skrll && src[len + 2] == ','
766 1.1.1.4 christos && TOLOWER (src[len + 3]) != 'p'
767 1.1 skrll && TOLOWER (src[len + 4]) != 'c'
768 1.1 skrll && src[len + 5] != ')')
769 1.1 skrll {
770 1.1 skrll *ptr = src + len + 6;
771 1.1 skrll op->mode |= mode;
772 1.1 skrll return;
773 1.1 skrll }
774 1.1 skrll /* Fall through into disp case - the grammar is somewhat
775 1.1 skrll ambiguous, so we should try whether it's a DISP operand
776 1.1 skrll after all ("ER3.L" might be a poorly named label...). */
777 1.1 skrll }
778 1.1 skrll
779 1.1 skrll /* Disp. */
780 1.1 skrll
781 1.1 skrll /* Start off assuming a 16 bit offset. */
782 1.1 skrll
783 1.1 skrll src = parse_exp (src, op);
784 1.1 skrll if (*src == ')')
785 1.1 skrll {
786 1.1 skrll op->mode |= ABS | direction;
787 1.1 skrll *ptr = src + 1;
788 1.1 skrll return;
789 1.1 skrll }
790 1.1 skrll
791 1.1 skrll if (*src != ',')
792 1.1 skrll {
793 1.1 skrll as_bad (_("expected @(exp, reg16)"));
794 1.1 skrll return;
795 1.1 skrll }
796 1.1 skrll src++;
797 1.1 skrll
798 1.1 skrll len = parse_reg (src, &mode, &op->reg, direction);
799 1.1 skrll if (len == 0 || (mode & MODE) != REG)
800 1.1 skrll {
801 1.1 skrll as_bad (_("expected @(exp, reg16)"));
802 1.1 skrll return;
803 1.1 skrll }
804 1.1 skrll src += len;
805 1.1 skrll if (src[0] == '.')
806 1.1 skrll {
807 1.1 skrll switch (TOLOWER (src[1]))
808 1.1 skrll {
809 1.1 skrll case 'b':
810 1.1 skrll op->mode |= INDEXB | direction;
811 1.1 skrll break;
812 1.1 skrll case 'w':
813 1.1 skrll op->mode |= INDEXW | direction;
814 1.1 skrll break;
815 1.1 skrll case 'l':
816 1.1 skrll op->mode |= INDEXL | direction;
817 1.1 skrll break;
818 1.1 skrll default:
819 1.1 skrll as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
820 1.1 skrll }
821 1.1 skrll src += 2;
822 1.1 skrll op->reg &= 7;
823 1.1 skrll }
824 1.1 skrll else
825 1.1 skrll op->mode |= DISP | direction;
826 1.1 skrll src = skip_colonthing (src, &op->mode);
827 1.1 skrll
828 1.1.1.5 christos if (*src != ')')
829 1.1 skrll {
830 1.1 skrll as_bad (_("expected @(exp, reg16)"));
831 1.1 skrll return;
832 1.1 skrll }
833 1.1 skrll *ptr = src + 1;
834 1.1 skrll return;
835 1.1 skrll }
836 1.1 skrll len = parse_reg (src, &mode, &num, direction);
837 1.1 skrll
838 1.1 skrll if (len)
839 1.1 skrll {
840 1.1 skrll src += len;
841 1.1 skrll if (*src == '+' || *src == '-')
842 1.1 skrll {
843 1.1 skrll if (((mode & SIZE) != PSIZE)
844 1.1 skrll /* For Normal mode accept 16 bit and 32 bit pointer registers. */
845 1.1 skrll && (!Nmode || ((mode & SIZE) != L_32)))
846 1.1 skrll as_bad (_("Wrong size pointer register for architecture."));
847 1.1 skrll op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
848 1.1 skrll op->reg = num;
849 1.1 skrll src++;
850 1.1 skrll *ptr = src;
851 1.1 skrll return;
852 1.1 skrll }
853 1.1 skrll if (((mode & SIZE) != PSIZE)
854 1.1 skrll /* For Normal mode accept 16 bit and 32 bit pointer registers. */
855 1.1 skrll && (!Nmode || ((mode & SIZE) != L_32)))
856 1.1 skrll as_bad (_("Wrong size pointer register for architecture."));
857 1.1 skrll
858 1.1 skrll op->mode = direction | IND | PSIZE;
859 1.1 skrll op->reg = num;
860 1.1 skrll *ptr = src;
861 1.1 skrll
862 1.1 skrll return;
863 1.1 skrll }
864 1.1 skrll else
865 1.1 skrll {
866 1.1 skrll /* must be a symbol */
867 1.1 skrll
868 1.1 skrll op->mode = ABS | direction;
869 1.1 skrll *ptr = parse_exp (src, op);
870 1.1 skrll return;
871 1.1 skrll }
872 1.1 skrll }
873 1.1 skrll
874 1.1 skrll if (*src == '#')
875 1.1 skrll {
876 1.1 skrll op->mode = IMM;
877 1.1 skrll *ptr = parse_exp (src + 1, op);
878 1.1 skrll return;
879 1.1 skrll }
880 1.1.1.4 christos else if (strncmp (src, "mach", 4) == 0 ||
881 1.1 skrll strncmp (src, "macl", 4) == 0 ||
882 1.1.1.4 christos strncmp (src, "MACH", 4) == 0 ||
883 1.1 skrll strncmp (src, "MACL", 4) == 0)
884 1.1 skrll {
885 1.1 skrll op->reg = TOLOWER (src[3]) == 'l';
886 1.1 skrll op->mode = MACREG;
887 1.1 skrll *ptr = src + 4;
888 1.1 skrll return;
889 1.1 skrll }
890 1.1 skrll else
891 1.1 skrll {
892 1.1 skrll op->mode = PCREL;
893 1.1 skrll *ptr = parse_exp (src, op);
894 1.1 skrll }
895 1.1 skrll }
896 1.1 skrll
897 1.1 skrll static char *
898 1.1 skrll get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
899 1.1 skrll {
900 1.1 skrll char *ptr = op_end;
901 1.1 skrll
902 1.1 skrll switch (noperands)
903 1.1 skrll {
904 1.1 skrll case 0:
905 1.1 skrll break;
906 1.1 skrll
907 1.1 skrll case 1:
908 1.1 skrll ptr++;
909 1.1 skrll get_operand (&ptr, operand + 0, SRC);
910 1.1 skrll if (*ptr == ',')
911 1.1 skrll {
912 1.1 skrll ptr++;
913 1.1 skrll get_operand (&ptr, operand + 1, DST);
914 1.1 skrll }
915 1.1 skrll break;
916 1.1 skrll
917 1.1 skrll case 2:
918 1.1 skrll ptr++;
919 1.1 skrll get_operand (&ptr, operand + 0, SRC);
920 1.1 skrll if (*ptr == ',')
921 1.1 skrll ptr++;
922 1.1 skrll get_operand (&ptr, operand + 1, DST);
923 1.1 skrll break;
924 1.1 skrll
925 1.1 skrll case 3:
926 1.1 skrll ptr++;
927 1.1 skrll get_operand (&ptr, operand + 0, SRC);
928 1.1 skrll if (*ptr == ',')
929 1.1 skrll ptr++;
930 1.1 skrll get_operand (&ptr, operand + 1, DST);
931 1.1 skrll if (*ptr == ',')
932 1.1 skrll ptr++;
933 1.1 skrll get_operand (&ptr, operand + 2, OP3);
934 1.1 skrll break;
935 1.1 skrll
936 1.1 skrll default:
937 1.1 skrll abort ();
938 1.1 skrll }
939 1.1 skrll
940 1.1 skrll return ptr;
941 1.1 skrll }
942 1.1 skrll
943 1.1 skrll /* MOVA has special requirements. Rather than adding twice the amount of
944 1.1 skrll addressing modes, we simply special case it a bit. */
945 1.1 skrll static void
946 1.1 skrll get_mova_operands (char *op_end, struct h8_op *operand)
947 1.1 skrll {
948 1.1 skrll char *ptr = op_end;
949 1.1 skrll
950 1.1 skrll if (ptr[1] != '@' || ptr[2] != '(')
951 1.1 skrll goto error;
952 1.1 skrll ptr += 3;
953 1.1 skrll operand[0].mode = 0;
954 1.1 skrll ptr = parse_exp (ptr, &operand[0]);
955 1.1 skrll
956 1.1 skrll if (*ptr !=',')
957 1.1 skrll goto error;
958 1.1 skrll ptr++;
959 1.1 skrll get_operand (&ptr, operand + 1, DST);
960 1.1 skrll
961 1.1 skrll if (*ptr =='.')
962 1.1 skrll {
963 1.1 skrll ptr++;
964 1.1 skrll switch (*ptr++)
965 1.1 skrll {
966 1.1 skrll case 'b': case 'B':
967 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
968 1.1 skrll break;
969 1.1 skrll case 'w': case 'W':
970 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
971 1.1 skrll break;
972 1.1 skrll case 'l': case 'L':
973 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
974 1.1 skrll break;
975 1.1 skrll default:
976 1.1 skrll goto error;
977 1.1 skrll }
978 1.1 skrll }
979 1.1 skrll else if ((operand[1].mode & MODE) == LOWREG)
980 1.1 skrll {
981 1.1.1.4 christos switch (operand[1].mode & SIZE)
982 1.1 skrll {
983 1.1 skrll case L_8:
984 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
985 1.1 skrll break;
986 1.1 skrll case L_16:
987 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
988 1.1 skrll break;
989 1.1 skrll case L_32:
990 1.1 skrll operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
991 1.1 skrll break;
992 1.1 skrll default:
993 1.1 skrll goto error;
994 1.1 skrll }
995 1.1 skrll }
996 1.1 skrll else
997 1.1 skrll goto error;
998 1.1 skrll
999 1.1 skrll if (*ptr++ != ')' || *ptr++ != ',')
1000 1.1 skrll goto error;
1001 1.1 skrll get_operand (&ptr, operand + 2, OP3);
1002 1.1 skrll /* See if we can use the short form of MOVA. */
1003 1.1 skrll if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
1004 1.1 skrll && (operand[2].mode & MODE) == REG
1005 1.1 skrll && (operand[1].reg & 7) == (operand[2].reg & 7))
1006 1.1 skrll {
1007 1.1 skrll operand[1].mode = operand[2].mode = 0;
1008 1.1 skrll operand[0].reg = operand[2].reg & 7;
1009 1.1 skrll }
1010 1.1 skrll return;
1011 1.1 skrll
1012 1.1 skrll error:
1013 1.1 skrll as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
1014 1.1 skrll }
1015 1.1 skrll
1016 1.1 skrll static void
1017 1.1 skrll get_rtsl_operands (char *ptr, struct h8_op *operand)
1018 1.1 skrll {
1019 1.1 skrll int mode, len, type = 0;
1020 1.1 skrll unsigned int num, num2;
1021 1.1 skrll
1022 1.1 skrll ptr++;
1023 1.1 skrll if (*ptr == '(')
1024 1.1 skrll {
1025 1.1 skrll ptr++;
1026 1.1 skrll type = 1;
1027 1.1 skrll }
1028 1.1 skrll len = parse_reg (ptr, &mode, &num, SRC);
1029 1.1 skrll if (len == 0 || (mode & MODE) != REG)
1030 1.1 skrll {
1031 1.1 skrll as_bad (_("expected register"));
1032 1.1 skrll return;
1033 1.1 skrll }
1034 1.1 skrll ptr += len;
1035 1.1 skrll if (*ptr == '-')
1036 1.1 skrll {
1037 1.1 skrll len = parse_reg (++ptr, &mode, &num2, SRC);
1038 1.1 skrll if (len == 0 || (mode & MODE) != REG)
1039 1.1 skrll {
1040 1.1 skrll as_bad (_("expected register"));
1041 1.1 skrll return;
1042 1.1 skrll }
1043 1.1 skrll ptr += len;
1044 1.1 skrll /* CONST_xxx are used as placeholders in the opcode table. */
1045 1.1 skrll num = num2 - num;
1046 1.1 skrll if (num > 3)
1047 1.1 skrll {
1048 1.1 skrll as_bad (_("invalid register list"));
1049 1.1 skrll return;
1050 1.1 skrll }
1051 1.1 skrll }
1052 1.1 skrll else
1053 1.1 skrll num2 = num, num = 0;
1054 1.1 skrll if (type == 1 && *ptr++ != ')')
1055 1.1 skrll {
1056 1.1 skrll as_bad (_("expected closing paren"));
1057 1.1 skrll return;
1058 1.1 skrll }
1059 1.1 skrll operand[0].mode = RS32;
1060 1.1 skrll operand[1].mode = RD32;
1061 1.1 skrll operand[0].reg = num;
1062 1.1 skrll operand[1].reg = num2;
1063 1.1 skrll }
1064 1.1 skrll
1065 1.1 skrll /* Passed a pointer to a list of opcodes which use different
1066 1.1 skrll addressing modes, return the opcode which matches the opcodes
1067 1.1 skrll provided. */
1068 1.1 skrll
1069 1.1 skrll static const struct h8_instruction *
1070 1.1 skrll get_specific (const struct h8_instruction *instruction,
1071 1.1 skrll struct h8_op *operands, int size)
1072 1.1 skrll {
1073 1.1 skrll const struct h8_instruction *this_try = instruction;
1074 1.1 skrll const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1075 1.1 skrll int found = 0;
1076 1.1 skrll int this_index = instruction->idx;
1077 1.1 skrll int noperands = 0;
1078 1.1 skrll
1079 1.1 skrll /* There's only one ldm/stm and it's easier to just
1080 1.1 skrll get out quick for them. */
1081 1.1 skrll if (OP_KIND (instruction->opcode->how) == O_LDM
1082 1.1 skrll || OP_KIND (instruction->opcode->how) == O_STM)
1083 1.1 skrll return this_try;
1084 1.1 skrll
1085 1.1 skrll while (noperands < 3 && operands[noperands].mode != 0)
1086 1.1 skrll noperands++;
1087 1.1 skrll
1088 1.1 skrll while (this_index == instruction->idx && !found)
1089 1.1 skrll {
1090 1.1 skrll int this_size;
1091 1.1 skrll
1092 1.1 skrll found = 1;
1093 1.1 skrll this_try = instruction++;
1094 1.1 skrll this_size = this_try->opcode->how & SN;
1095 1.1 skrll
1096 1.1 skrll if (this_try->noperands != noperands)
1097 1.1 skrll found = 0;
1098 1.1 skrll else if (this_try->noperands > 0)
1099 1.1 skrll {
1100 1.1 skrll int i;
1101 1.1 skrll
1102 1.1 skrll for (i = 0; i < this_try->noperands && found; i++)
1103 1.1 skrll {
1104 1.1 skrll op_type op = this_try->opcode->args.nib[i];
1105 1.1 skrll int op_mode = op & MODE;
1106 1.1 skrll int op_size = op & SIZE;
1107 1.1 skrll int x = operands[i].mode;
1108 1.1 skrll int x_mode = x & MODE;
1109 1.1 skrll int x_size = x & SIZE;
1110 1.1 skrll
1111 1.1 skrll if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1112 1.1 skrll {
1113 1.1 skrll if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1114 1.1 skrll || (x_size == L_16 && (operands[i].reg & 8) == 8))
1115 1.1 skrll as_warn (_("can't use high part of register in operand %d"), i);
1116 1.1 skrll
1117 1.1 skrll if (x_size != op_size)
1118 1.1 skrll found = 0;
1119 1.1 skrll }
1120 1.1 skrll else if (op_mode == REG)
1121 1.1 skrll {
1122 1.1 skrll if (x_mode == LOWREG)
1123 1.1 skrll x_mode = REG;
1124 1.1 skrll if (x_mode != REG)
1125 1.1 skrll found = 0;
1126 1.1 skrll
1127 1.1 skrll if (x_size == L_P)
1128 1.1 skrll x_size = (Hmode ? L_32 : L_16);
1129 1.1 skrll if (op_size == L_P)
1130 1.1 skrll op_size = (Hmode ? L_32 : L_16);
1131 1.1 skrll
1132 1.1 skrll /* The size of the reg is v important. */
1133 1.1 skrll if (op_size != x_size)
1134 1.1 skrll found = 0;
1135 1.1 skrll }
1136 1.1 skrll else if (op_mode & CTRL) /* control register */
1137 1.1 skrll {
1138 1.1 skrll if (!(x_mode & CTRL))
1139 1.1 skrll found = 0;
1140 1.1 skrll
1141 1.1 skrll switch (x_mode)
1142 1.1 skrll {
1143 1.1 skrll case CCR:
1144 1.1 skrll if (op_mode != CCR &&
1145 1.1 skrll op_mode != CCR_EXR &&
1146 1.1 skrll op_mode != CC_EX_VB_SB)
1147 1.1 skrll found = 0;
1148 1.1 skrll break;
1149 1.1 skrll case EXR:
1150 1.1 skrll if (op_mode != EXR &&
1151 1.1 skrll op_mode != CCR_EXR &&
1152 1.1 skrll op_mode != CC_EX_VB_SB)
1153 1.1 skrll found = 0;
1154 1.1 skrll break;
1155 1.1 skrll case MACH:
1156 1.1 skrll if (op_mode != MACH &&
1157 1.1 skrll op_mode != MACREG)
1158 1.1 skrll found = 0;
1159 1.1 skrll break;
1160 1.1 skrll case MACL:
1161 1.1 skrll if (op_mode != MACL &&
1162 1.1 skrll op_mode != MACREG)
1163 1.1 skrll found = 0;
1164 1.1 skrll break;
1165 1.1 skrll case VBR:
1166 1.1 skrll if (op_mode != VBR &&
1167 1.1 skrll op_mode != VBR_SBR &&
1168 1.1 skrll op_mode != CC_EX_VB_SB)
1169 1.1 skrll found = 0;
1170 1.1 skrll break;
1171 1.1 skrll case SBR:
1172 1.1 skrll if (op_mode != SBR &&
1173 1.1 skrll op_mode != VBR_SBR &&
1174 1.1 skrll op_mode != CC_EX_VB_SB)
1175 1.1 skrll found = 0;
1176 1.1 skrll break;
1177 1.1 skrll }
1178 1.1 skrll }
1179 1.1 skrll else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1180 1.1 skrll {
1181 1.1 skrll operands[i].mode &= ~MODE;
1182 1.1 skrll operands[i].mode |= ABSJMP;
1183 1.1 skrll /* But it may not be 24 bits long. */
1184 1.1 skrll if (x_mode == ABS && !Hmode)
1185 1.1 skrll {
1186 1.1 skrll operands[i].mode &= ~SIZE;
1187 1.1 skrll operands[i].mode |= L_16;
1188 1.1 skrll }
1189 1.1 skrll if ((operands[i].mode & SIZE) == L_32
1190 1.1 skrll && (op_mode & SIZE) != L_32)
1191 1.1 skrll found = 0;
1192 1.1 skrll }
1193 1.1 skrll else if (x_mode == IMM && op_mode != IMM)
1194 1.1 skrll {
1195 1.1.1.3 christos offsetT num = operands[i].exp.X_add_number & 0xffffffff;
1196 1.1 skrll if (op_mode == KBIT || op_mode == DBIT)
1197 1.1 skrll /* This is ok if the immediate value is sensible. */;
1198 1.1 skrll else if (op_mode == CONST_2)
1199 1.1 skrll found = num == 2;
1200 1.1 skrll else if (op_mode == CONST_4)
1201 1.1 skrll found = num == 4;
1202 1.1 skrll else if (op_mode == CONST_8)
1203 1.1 skrll found = num == 8;
1204 1.1 skrll else if (op_mode == CONST_16)
1205 1.1 skrll found = num == 16;
1206 1.1 skrll else
1207 1.1 skrll found = 0;
1208 1.1 skrll }
1209 1.1 skrll else if (op_mode == PCREL && op_mode == x_mode)
1210 1.1 skrll {
1211 1.1 skrll /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1212 1.1 skrll If x_size is L_8, promote it. */
1213 1.1 skrll if (OP_KIND (this_try->opcode->how) == O_MOVSD
1214 1.1 skrll || OP_KIND (this_try->opcode->how) == O_BSRBC
1215 1.1 skrll || OP_KIND (this_try->opcode->how) == O_BSRBS)
1216 1.1 skrll if (x_size == L_8)
1217 1.1 skrll x_size = L_16;
1218 1.1 skrll
1219 1.1 skrll /* The size of the displacement is important. */
1220 1.1 skrll if (op_size != x_size)
1221 1.1 skrll found = 0;
1222 1.1 skrll }
1223 1.1 skrll else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1224 1.1 skrll || op_mode == INDEXB || op_mode == INDEXW
1225 1.1 skrll || op_mode == INDEXL)
1226 1.1 skrll && op_mode == x_mode)
1227 1.1 skrll {
1228 1.1 skrll /* Promote a L_24 to L_32 if it makes us match. */
1229 1.1 skrll if (x_size == L_24 && op_size == L_32)
1230 1.1 skrll {
1231 1.1 skrll x &= ~SIZE;
1232 1.1 skrll x |= x_size = L_32;
1233 1.1 skrll }
1234 1.1 skrll
1235 1.1 skrll if (((x_size == L_16 && op_size == L_16U)
1236 1.1 skrll || (x_size == L_8 && op_size == L_8U)
1237 1.1 skrll || (x_size == L_3 && op_size == L_3NZ))
1238 1.1 skrll /* We're deliberately more permissive for ABS modes. */
1239 1.1 skrll && (op_mode == ABS
1240 1.1 skrll || constant_fits_size_p (operands + i, op_size,
1241 1.1 skrll op & NO_SYMBOLS)))
1242 1.1 skrll x_size = op_size;
1243 1.1 skrll
1244 1.1 skrll if (x_size != 0 && op_size != x_size)
1245 1.1 skrll found = 0;
1246 1.1 skrll else if (x_size == 0
1247 1.1 skrll && ! constant_fits_size_p (operands + i, op_size,
1248 1.1 skrll op & NO_SYMBOLS))
1249 1.1 skrll found = 0;
1250 1.1 skrll }
1251 1.1 skrll else if (op_mode != x_mode)
1252 1.1 skrll {
1253 1.1 skrll found = 0;
1254 1.1 skrll }
1255 1.1 skrll }
1256 1.1 skrll }
1257 1.1 skrll if (found)
1258 1.1 skrll {
1259 1.1 skrll if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1260 1.1 skrll || (this_try->opcode->available == AV_H8S && ! Smode)
1261 1.1 skrll || (this_try->opcode->available == AV_H8H && ! Hmode))
1262 1.1 skrll found = 0, found_other = this_try;
1263 1.1 skrll else if (this_size != size && (this_size != SN && size != SN))
1264 1.1 skrll found_mismatched = this_try, found = 0;
1265 1.1 skrll
1266 1.1 skrll }
1267 1.1 skrll }
1268 1.1 skrll if (found)
1269 1.1 skrll return this_try;
1270 1.1 skrll if (found_other)
1271 1.1 skrll {
1272 1.1 skrll as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1273 1.1 skrll found_other->opcode->name,
1274 1.1 skrll (! Hmode && ! Smode ? "H8/300"
1275 1.1 skrll : SXmode ? "H8sx"
1276 1.1 skrll : Smode ? "H8/300S"
1277 1.1 skrll : "H8/300H"));
1278 1.1 skrll }
1279 1.1 skrll else if (found_mismatched)
1280 1.1 skrll {
1281 1.1 skrll as_warn (_("mismatch between opcode size and operand size"));
1282 1.1 skrll return found_mismatched;
1283 1.1 skrll }
1284 1.1 skrll return 0;
1285 1.1 skrll }
1286 1.1 skrll
1287 1.1 skrll static void
1288 1.1.1.5 christos check_operand (struct h8_op *operand, unsigned int width, const char *string)
1289 1.1 skrll {
1290 1.1 skrll if (operand->exp.X_add_symbol == 0
1291 1.1 skrll && operand->exp.X_op_symbol == 0)
1292 1.1 skrll {
1293 1.1 skrll /* No symbol involved, let's look at offset, it's dangerous if
1294 1.1 skrll any of the high bits are not 0 or ff's, find out by oring or
1295 1.1 skrll anding with the width and seeing if the answer is 0 or all
1296 1.1 skrll fs. */
1297 1.1 skrll
1298 1.1 skrll if (! constant_fits_width_p (operand, width))
1299 1.1 skrll {
1300 1.1 skrll if (width == 255
1301 1.1 skrll && (operand->exp.X_add_number & 0xff00) == 0xff00)
1302 1.1 skrll {
1303 1.1 skrll /* Just ignore this one - which happens when trying to
1304 1.1 skrll fit a 16 bit address truncated into an 8 bit address
1305 1.1 skrll of something like bset. */
1306 1.1 skrll }
1307 1.1 skrll else if (strcmp (string, "@") == 0
1308 1.1 skrll && width == 0xffff
1309 1.1 skrll && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1310 1.1 skrll {
1311 1.1 skrll /* Just ignore this one - which happens when trying to
1312 1.1 skrll fit a 24 bit address truncated into a 16 bit address
1313 1.1 skrll of something like mov.w. */
1314 1.1 skrll }
1315 1.1 skrll else
1316 1.1 skrll {
1317 1.1 skrll as_warn (_("operand %s0x%lx out of range."), string,
1318 1.1 skrll (unsigned long) operand->exp.X_add_number);
1319 1.1 skrll }
1320 1.1 skrll }
1321 1.1 skrll }
1322 1.1 skrll }
1323 1.1 skrll
1324 1.1 skrll /* RELAXMODE has one of 3 values:
1325 1.1 skrll
1326 1.1 skrll 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1327 1.1 skrll
1328 1.1 skrll 1 Output a relaxable 24bit absolute mov.w address relocation
1329 1.1 skrll (may relax into a 16bit absolute address).
1330 1.1 skrll
1331 1.1 skrll 2 Output a relaxable 16/24 absolute mov.b address relocation
1332 1.1 skrll (may relax into an 8bit absolute address). */
1333 1.1 skrll
1334 1.1 skrll static void
1335 1.1.1.2 christos do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, const struct h8_instruction *this_try)
1336 1.1 skrll {
1337 1.1 skrll int idx;
1338 1.1 skrll int size;
1339 1.1 skrll int where;
1340 1.1 skrll char *bytes = frag_now->fr_literal + offset;
1341 1.1 skrll
1342 1.1.1.5 christos const char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1343 1.1 skrll
1344 1.1 skrll if (operand->exp.X_add_symbol == 0)
1345 1.1 skrll {
1346 1.1 skrll switch (operand->mode & SIZE)
1347 1.1 skrll {
1348 1.1 skrll case L_2:
1349 1.1 skrll check_operand (operand, 0x3, t);
1350 1.1 skrll bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1351 1.1 skrll break;
1352 1.1 skrll case L_3:
1353 1.1 skrll case L_3NZ:
1354 1.1 skrll check_operand (operand, 0x7, t);
1355 1.1 skrll bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1356 1.1 skrll break;
1357 1.1 skrll case L_4:
1358 1.1 skrll check_operand (operand, 0xF, t);
1359 1.1 skrll bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1360 1.1 skrll break;
1361 1.1 skrll case L_5:
1362 1.1 skrll check_operand (operand, 0x1F, t);
1363 1.1 skrll bytes[0] |= operand->exp.X_add_number & 31;
1364 1.1 skrll break;
1365 1.1 skrll case L_8:
1366 1.1 skrll case L_8U:
1367 1.1 skrll check_operand (operand, 0xff, t);
1368 1.1 skrll bytes[0] |= operand->exp.X_add_number;
1369 1.1 skrll break;
1370 1.1 skrll case L_16:
1371 1.1 skrll case L_16U:
1372 1.1 skrll check_operand (operand, 0xffff, t);
1373 1.1 skrll bytes[0] |= operand->exp.X_add_number >> 8;
1374 1.1 skrll bytes[1] |= operand->exp.X_add_number >> 0;
1375 1.1.1.2 christos #ifdef OBJ_ELF
1376 1.1.1.2 christos /* MOVA needs both relocs to relax the second operand properly. */
1377 1.1.1.2 christos if (relaxmode != 0
1378 1.1.1.2 christos && (OP_KIND(this_try->opcode->how) == O_MOVAB
1379 1.1.1.2 christos || OP_KIND(this_try->opcode->how) == O_MOVAW
1380 1.1.1.2 christos || OP_KIND(this_try->opcode->how) == O_MOVAL))
1381 1.1.1.2 christos {
1382 1.1.1.2 christos idx = BFD_RELOC_16;
1383 1.1.1.2 christos fix_new_exp (frag_now, offset, 2, &operand->exp, 0, idx);
1384 1.1.1.2 christos }
1385 1.1.1.2 christos #endif
1386 1.1 skrll break;
1387 1.1 skrll case L_24:
1388 1.1 skrll check_operand (operand, 0xffffff, t);
1389 1.1 skrll bytes[0] |= operand->exp.X_add_number >> 16;
1390 1.1 skrll bytes[1] |= operand->exp.X_add_number >> 8;
1391 1.1 skrll bytes[2] |= operand->exp.X_add_number >> 0;
1392 1.1 skrll break;
1393 1.1 skrll
1394 1.1 skrll case L_32:
1395 1.1 skrll /* This should be done with bfd. */
1396 1.1 skrll bytes[0] |= operand->exp.X_add_number >> 24;
1397 1.1 skrll bytes[1] |= operand->exp.X_add_number >> 16;
1398 1.1 skrll bytes[2] |= operand->exp.X_add_number >> 8;
1399 1.1 skrll bytes[3] |= operand->exp.X_add_number >> 0;
1400 1.1 skrll if (relaxmode != 0)
1401 1.1 skrll {
1402 1.1.1.4 christos #ifdef OBJ_ELF
1403 1.1.1.4 christos if ((operand->mode & MODE) == DISP && relaxmode == 1)
1404 1.1.1.4 christos idx = BFD_RELOC_H8_DISP32A16;
1405 1.1.1.4 christos else
1406 1.1.1.4 christos #endif
1407 1.1.1.4 christos idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1408 1.1 skrll fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1409 1.1 skrll }
1410 1.1 skrll break;
1411 1.1 skrll }
1412 1.1 skrll }
1413 1.1 skrll else
1414 1.1 skrll {
1415 1.1 skrll switch (operand->mode & SIZE)
1416 1.1 skrll {
1417 1.1 skrll case L_24:
1418 1.1 skrll case L_32:
1419 1.1 skrll size = 4;
1420 1.1 skrll where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1421 1.1.1.4 christos #ifdef OBJ_ELF
1422 1.1.1.4 christos if ((operand->mode & MODE) == DISP && relaxmode == 1)
1423 1.1.1.4 christos idx = BFD_RELOC_H8_DISP32A16;
1424 1.1.1.4 christos else
1425 1.1.1.4 christos #endif
1426 1.1 skrll if (relaxmode == 2)
1427 1.1 skrll idx = R_MOV24B1;
1428 1.1 skrll else if (relaxmode == 1)
1429 1.1 skrll idx = R_MOVL1;
1430 1.1 skrll else
1431 1.1 skrll idx = R_RELLONG;
1432 1.1 skrll break;
1433 1.1 skrll default:
1434 1.1 skrll as_bad (_("Can't work out size of operand.\n"));
1435 1.1 skrll case L_16:
1436 1.1 skrll case L_16U:
1437 1.1 skrll size = 2;
1438 1.1 skrll where = 0;
1439 1.1 skrll if (relaxmode == 2)
1440 1.1 skrll idx = R_MOV16B1;
1441 1.1 skrll else
1442 1.1 skrll idx = R_RELWORD;
1443 1.1 skrll operand->exp.X_add_number =
1444 1.1 skrll ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1445 1.1 skrll operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1446 1.1 skrll break;
1447 1.1 skrll case L_8:
1448 1.1 skrll size = 1;
1449 1.1 skrll where = 0;
1450 1.1 skrll idx = R_RELBYTE;
1451 1.1 skrll operand->exp.X_add_number =
1452 1.1 skrll ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1453 1.1 skrll operand->exp.X_add_number |= bytes[0];
1454 1.1 skrll }
1455 1.1 skrll
1456 1.1 skrll fix_new_exp (frag_now,
1457 1.1 skrll offset + where,
1458 1.1 skrll size,
1459 1.1 skrll &operand->exp,
1460 1.1 skrll 0,
1461 1.1 skrll idx);
1462 1.1 skrll }
1463 1.1 skrll }
1464 1.1 skrll
1465 1.1 skrll /* Now we know what sort of opcodes it is, let's build the bytes. */
1466 1.1 skrll
1467 1.1 skrll static void
1468 1.1 skrll build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1469 1.1 skrll {
1470 1.1 skrll int i;
1471 1.1 skrll char *output = frag_more (this_try->length);
1472 1.1 skrll const op_type *nibble_ptr = this_try->opcode->data.nib;
1473 1.1 skrll op_type c;
1474 1.1 skrll unsigned int nibble_count = 0;
1475 1.1 skrll int op_at[3];
1476 1.1 skrll int nib = 0;
1477 1.1 skrll int movb = 0;
1478 1.1 skrll char asnibbles[100];
1479 1.1 skrll char *p = asnibbles;
1480 1.1 skrll int high, low;
1481 1.1 skrll
1482 1.1 skrll if (!Hmode && this_try->opcode->available != AV_H8)
1483 1.1 skrll as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1484 1.1 skrll this_try->opcode->name);
1485 1.1.1.4 christos else if (!Smode
1486 1.1.1.4 christos && this_try->opcode->available != AV_H8
1487 1.1 skrll && this_try->opcode->available != AV_H8H)
1488 1.1 skrll as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1489 1.1 skrll this_try->opcode->name);
1490 1.1.1.4 christos else if (!SXmode
1491 1.1 skrll && this_try->opcode->available != AV_H8
1492 1.1 skrll && this_try->opcode->available != AV_H8H
1493 1.1 skrll && this_try->opcode->available != AV_H8S)
1494 1.1 skrll as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1495 1.1 skrll this_try->opcode->name);
1496 1.1 skrll
1497 1.1 skrll while (*nibble_ptr != (op_type) E)
1498 1.1 skrll {
1499 1.1 skrll int d;
1500 1.1 skrll
1501 1.1 skrll nib = 0;
1502 1.1 skrll c = *nibble_ptr++;
1503 1.1 skrll
1504 1.1 skrll d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1505 1.1 skrll
1506 1.1 skrll if (c < 16)
1507 1.1 skrll nib = c;
1508 1.1 skrll else
1509 1.1 skrll {
1510 1.1 skrll int c2 = c & MODE;
1511 1.1 skrll
1512 1.1 skrll if (c2 == REG || c2 == LOWREG
1513 1.1 skrll || c2 == IND || c2 == PREINC || c2 == PREDEC
1514 1.1 skrll || c2 == POSTINC || c2 == POSTDEC)
1515 1.1 skrll {
1516 1.1 skrll nib = operand[d].reg;
1517 1.1 skrll if (c2 == LOWREG)
1518 1.1 skrll nib &= 7;
1519 1.1 skrll }
1520 1.1 skrll
1521 1.1 skrll else if (c & CTRL) /* Control reg operand. */
1522 1.1 skrll nib = operand[d].reg;
1523 1.1 skrll
1524 1.1 skrll else if ((c & DISPREG) == (DISPREG))
1525 1.1 skrll {
1526 1.1 skrll nib = operand[d].reg;
1527 1.1 skrll }
1528 1.1 skrll else if (c2 == ABS)
1529 1.1 skrll {
1530 1.1 skrll operand[d].mode = c;
1531 1.1 skrll op_at[d] = nibble_count;
1532 1.1 skrll nib = 0;
1533 1.1 skrll }
1534 1.1 skrll else if (c2 == IMM || c2 == PCREL || c2 == ABS
1535 1.1 skrll || (c & ABSJMP) || c2 == DISP)
1536 1.1 skrll {
1537 1.1 skrll operand[d].mode = c;
1538 1.1 skrll op_at[d] = nibble_count;
1539 1.1 skrll nib = 0;
1540 1.1 skrll }
1541 1.1 skrll else if ((c & IGNORE) || (c & DATA))
1542 1.1 skrll nib = 0;
1543 1.1 skrll
1544 1.1 skrll else if (c2 == DBIT)
1545 1.1 skrll {
1546 1.1 skrll switch (operand[0].exp.X_add_number)
1547 1.1 skrll {
1548 1.1 skrll case 1:
1549 1.1 skrll nib = c;
1550 1.1 skrll break;
1551 1.1 skrll case 2:
1552 1.1 skrll nib = 0x8 | c;
1553 1.1 skrll break;
1554 1.1 skrll default:
1555 1.1 skrll as_bad (_("Need #1 or #2 here"));
1556 1.1 skrll }
1557 1.1 skrll }
1558 1.1 skrll else if (c2 == KBIT)
1559 1.1 skrll {
1560 1.1 skrll switch (operand[0].exp.X_add_number)
1561 1.1 skrll {
1562 1.1 skrll case 1:
1563 1.1 skrll nib = 0;
1564 1.1 skrll break;
1565 1.1 skrll case 2:
1566 1.1 skrll nib = 8;
1567 1.1 skrll break;
1568 1.1 skrll case 4:
1569 1.1 skrll if (!Hmode)
1570 1.1 skrll as_warn (_("#4 not valid on H8/300."));
1571 1.1 skrll nib = 9;
1572 1.1 skrll break;
1573 1.1 skrll
1574 1.1 skrll default:
1575 1.1 skrll as_bad (_("Need #1 or #2 here"));
1576 1.1 skrll break;
1577 1.1 skrll }
1578 1.1 skrll /* Stop it making a fix. */
1579 1.1 skrll operand[0].mode = 0;
1580 1.1 skrll }
1581 1.1 skrll
1582 1.1 skrll if (c & MEMRELAX)
1583 1.1 skrll operand[d].mode |= MEMRELAX;
1584 1.1 skrll
1585 1.1 skrll if (c & B31)
1586 1.1 skrll nib |= 0x8;
1587 1.1 skrll
1588 1.1 skrll if (c & B21)
1589 1.1 skrll nib |= 0x4;
1590 1.1 skrll
1591 1.1 skrll if (c & B11)
1592 1.1 skrll nib |= 0x2;
1593 1.1 skrll
1594 1.1 skrll if (c & B01)
1595 1.1 skrll nib |= 0x1;
1596 1.1 skrll
1597 1.1 skrll if (c2 == MACREG)
1598 1.1 skrll {
1599 1.1 skrll if (operand[0].mode == MACREG)
1600 1.1 skrll /* stmac has mac[hl] as the first operand. */
1601 1.1 skrll nib = 2 + operand[0].reg;
1602 1.1 skrll else
1603 1.1 skrll /* ldmac has mac[hl] as the second operand. */
1604 1.1 skrll nib = 2 + operand[1].reg;
1605 1.1 skrll }
1606 1.1 skrll }
1607 1.1 skrll nibble_count++;
1608 1.1 skrll
1609 1.1 skrll *p++ = nib;
1610 1.1 skrll }
1611 1.1 skrll
1612 1.1 skrll /* Disgusting. Why, oh why didn't someone ask us for advice
1613 1.1 skrll on the assembler format. */
1614 1.1 skrll if (OP_KIND (this_try->opcode->how) == O_LDM)
1615 1.1 skrll {
1616 1.1 skrll high = (operand[1].reg >> 8) & 0xf;
1617 1.1 skrll low = (operand[1].reg) & 0xf;
1618 1.1 skrll asnibbles[2] = high - low;
1619 1.1 skrll asnibbles[7] = high;
1620 1.1 skrll }
1621 1.1 skrll else if (OP_KIND (this_try->opcode->how) == O_STM)
1622 1.1 skrll {
1623 1.1 skrll high = (operand[0].reg >> 8) & 0xf;
1624 1.1 skrll low = (operand[0].reg) & 0xf;
1625 1.1 skrll asnibbles[2] = high - low;
1626 1.1 skrll asnibbles[7] = low;
1627 1.1 skrll }
1628 1.1 skrll
1629 1.1 skrll for (i = 0; i < this_try->length; i++)
1630 1.1 skrll output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1631 1.1 skrll
1632 1.1.1.4 christos /* Note if this is a mov.b or a bit manipulation instruction
1633 1.1 skrll there is a special relaxation which only applies. */
1634 1.1 skrll if ( this_try->opcode->how == O (O_MOV, SB)
1635 1.1 skrll || this_try->opcode->how == O (O_BCLR, SB)
1636 1.1 skrll || this_try->opcode->how == O (O_BAND, SB)
1637 1.1 skrll || this_try->opcode->how == O (O_BIAND, SB)
1638 1.1 skrll || this_try->opcode->how == O (O_BILD, SB)
1639 1.1 skrll || this_try->opcode->how == O (O_BIOR, SB)
1640 1.1 skrll || this_try->opcode->how == O (O_BIST, SB)
1641 1.1 skrll || this_try->opcode->how == O (O_BIXOR, SB)
1642 1.1 skrll || this_try->opcode->how == O (O_BLD, SB)
1643 1.1 skrll || this_try->opcode->how == O (O_BNOT, SB)
1644 1.1 skrll || this_try->opcode->how == O (O_BOR, SB)
1645 1.1 skrll || this_try->opcode->how == O (O_BSET, SB)
1646 1.1 skrll || this_try->opcode->how == O (O_BST, SB)
1647 1.1 skrll || this_try->opcode->how == O (O_BTST, SB)
1648 1.1 skrll || this_try->opcode->how == O (O_BXOR, SB))
1649 1.1 skrll movb = 1;
1650 1.1 skrll
1651 1.1 skrll /* Output any fixes. */
1652 1.1 skrll for (i = 0; i < this_try->noperands; i++)
1653 1.1 skrll {
1654 1.1 skrll int x = operand[i].mode;
1655 1.1 skrll int x_mode = x & MODE;
1656 1.1 skrll
1657 1.1 skrll if (x_mode == IMM || x_mode == DISP)
1658 1.1.1.4 christos {
1659 1.1.1.4 christos #ifndef OBJ_ELF
1660 1.1.1.4 christos /* Remove MEMRELAX flag added in h8300.h on mov with
1661 1.1.1.4 christos addressing mode "register indirect with displacement". */
1662 1.1.1.4 christos if (x_mode == DISP)
1663 1.1.1.4 christos x &= ~MEMRELAX;
1664 1.1.1.4 christos #endif
1665 1.1.1.4 christos do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1666 1.1.1.4 christos op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
1667 1.1.1.4 christos this_try);
1668 1.1.1.4 christos }
1669 1.1 skrll else if (x_mode == ABS)
1670 1.1 skrll do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1671 1.1 skrll op_at[i] & 1, operand + i,
1672 1.1.1.2 christos (x & MEMRELAX) ? movb + 1 : 0,
1673 1.1.1.2 christos this_try);
1674 1.1 skrll
1675 1.1 skrll else if (x_mode == PCREL)
1676 1.1 skrll {
1677 1.1 skrll int size16 = (x & SIZE) == L_16;
1678 1.1 skrll int size = size16 ? 2 : 1;
1679 1.1 skrll int type = size16 ? R_PCRWORD : R_PCRBYTE;
1680 1.1 skrll fixS *fixP;
1681 1.1 skrll
1682 1.1 skrll check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1683 1.1 skrll
1684 1.1 skrll if (operand[i].exp.X_add_number & 1)
1685 1.1 skrll as_warn (_("branch operand has odd offset (%lx)\n"),
1686 1.1 skrll (unsigned long) operand->exp.X_add_number);
1687 1.1 skrll #ifndef OBJ_ELF
1688 1.1 skrll /* The COFF port has always been off by one, changing it
1689 1.1 skrll now would be an incompatible change, so we leave it as-is.
1690 1.1 skrll
1691 1.1 skrll We don't want to do this for ELF as we want to be
1692 1.1 skrll compatible with the proposed ELF format from Hitachi. */
1693 1.1 skrll operand[i].exp.X_add_number -= 1;
1694 1.1 skrll #endif
1695 1.1 skrll if (size16)
1696 1.1 skrll {
1697 1.1 skrll operand[i].exp.X_add_number =
1698 1.1 skrll ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1699 1.1 skrll }
1700 1.1 skrll else
1701 1.1 skrll {
1702 1.1 skrll operand[i].exp.X_add_number =
1703 1.1 skrll ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1704 1.1 skrll }
1705 1.1 skrll
1706 1.1 skrll /* For BRA/S. */
1707 1.1 skrll if (! size16)
1708 1.1 skrll operand[i].exp.X_add_number |= output[op_at[i] / 2];
1709 1.1 skrll
1710 1.1 skrll fixP = fix_new_exp (frag_now,
1711 1.1 skrll output - frag_now->fr_literal + op_at[i] / 2,
1712 1.1 skrll size,
1713 1.1 skrll &operand[i].exp,
1714 1.1 skrll 1,
1715 1.1 skrll type);
1716 1.1 skrll fixP->fx_signed = 1;
1717 1.1 skrll }
1718 1.1 skrll else if (x_mode == MEMIND)
1719 1.1 skrll {
1720 1.1 skrll check_operand (operand + i, 0xff, "@@");
1721 1.1 skrll fix_new_exp (frag_now,
1722 1.1 skrll output - frag_now->fr_literal + 1,
1723 1.1 skrll 1,
1724 1.1 skrll &operand[i].exp,
1725 1.1 skrll 0,
1726 1.1 skrll R_MEM_INDIRECT);
1727 1.1 skrll }
1728 1.1 skrll else if (x_mode == VECIND)
1729 1.1 skrll {
1730 1.1 skrll check_operand (operand + i, 0x7f, "@@");
1731 1.1 skrll /* FIXME: approximating the effect of "B31" here...
1732 1.1 skrll This is very hackish, and ought to be done a better way. */
1733 1.1 skrll operand[i].exp.X_add_number |= 0x80;
1734 1.1 skrll fix_new_exp (frag_now,
1735 1.1 skrll output - frag_now->fr_literal + 1,
1736 1.1 skrll 1,
1737 1.1 skrll &operand[i].exp,
1738 1.1 skrll 0,
1739 1.1 skrll R_MEM_INDIRECT);
1740 1.1 skrll }
1741 1.1 skrll else if (x & ABSJMP)
1742 1.1 skrll {
1743 1.1 skrll int where = 0;
1744 1.1 skrll bfd_reloc_code_real_type reloc_type = R_JMPL1;
1745 1.1 skrll
1746 1.1 skrll #ifdef OBJ_ELF
1747 1.1 skrll /* To be compatible with the proposed H8 ELF format, we
1748 1.1 skrll want the relocation's offset to point to the first byte
1749 1.1 skrll that will be modified, not to the start of the instruction. */
1750 1.1.1.4 christos
1751 1.1 skrll if ((operand->mode & SIZE) == L_32)
1752 1.1 skrll {
1753 1.1 skrll where = 2;
1754 1.1 skrll reloc_type = R_RELLONG;
1755 1.1 skrll }
1756 1.1 skrll else
1757 1.1 skrll where = 1;
1758 1.1 skrll #endif
1759 1.1 skrll
1760 1.1 skrll /* This jmp may be a jump or a branch. */
1761 1.1 skrll
1762 1.1.1.4 christos check_operand (operand + i,
1763 1.1.1.4 christos SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1764 1.1 skrll "@");
1765 1.1 skrll
1766 1.1 skrll if (operand[i].exp.X_add_number & 1)
1767 1.1 skrll as_warn (_("branch operand has odd offset (%lx)\n"),
1768 1.1 skrll (unsigned long) operand->exp.X_add_number);
1769 1.1 skrll
1770 1.1 skrll if (!Hmode)
1771 1.1 skrll operand[i].exp.X_add_number =
1772 1.1 skrll ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1773 1.1 skrll fix_new_exp (frag_now,
1774 1.1 skrll output - frag_now->fr_literal + where,
1775 1.1 skrll 4,
1776 1.1 skrll &operand[i].exp,
1777 1.1 skrll 0,
1778 1.1 skrll reloc_type);
1779 1.1 skrll }
1780 1.1 skrll }
1781 1.1 skrll }
1782 1.1 skrll
1783 1.1 skrll /* Try to give an intelligent error message for common and simple to
1784 1.1 skrll detect errors. */
1785 1.1 skrll
1786 1.1 skrll static void
1787 1.1 skrll clever_message (const struct h8_instruction *instruction,
1788 1.1 skrll struct h8_op *operand)
1789 1.1 skrll {
1790 1.1 skrll /* Find out if there was more than one possible opcode. */
1791 1.1 skrll
1792 1.1 skrll if ((instruction + 1)->idx != instruction->idx)
1793 1.1 skrll {
1794 1.1 skrll int argn;
1795 1.1 skrll
1796 1.1 skrll /* Only one opcode of this flavour, try to guess which operand
1797 1.1 skrll didn't match. */
1798 1.1 skrll for (argn = 0; argn < instruction->noperands; argn++)
1799 1.1 skrll {
1800 1.1 skrll switch (instruction->opcode->args.nib[argn])
1801 1.1 skrll {
1802 1.1 skrll case RD16:
1803 1.1 skrll if (operand[argn].mode != RD16)
1804 1.1 skrll {
1805 1.1 skrll as_bad (_("destination operand must be 16 bit register"));
1806 1.1 skrll return;
1807 1.1 skrll
1808 1.1 skrll }
1809 1.1 skrll break;
1810 1.1 skrll
1811 1.1 skrll case RS8:
1812 1.1 skrll if (operand[argn].mode != RS8)
1813 1.1 skrll {
1814 1.1 skrll as_bad (_("source operand must be 8 bit register"));
1815 1.1 skrll return;
1816 1.1 skrll }
1817 1.1 skrll break;
1818 1.1 skrll
1819 1.1 skrll case ABS16DST:
1820 1.1 skrll if (operand[argn].mode != ABS16DST)
1821 1.1 skrll {
1822 1.1 skrll as_bad (_("destination operand must be 16bit absolute address"));
1823 1.1 skrll return;
1824 1.1 skrll }
1825 1.1 skrll break;
1826 1.1 skrll case RD8:
1827 1.1 skrll if (operand[argn].mode != RD8)
1828 1.1 skrll {
1829 1.1 skrll as_bad (_("destination operand must be 8 bit register"));
1830 1.1 skrll return;
1831 1.1 skrll }
1832 1.1 skrll break;
1833 1.1 skrll
1834 1.1 skrll case ABS16SRC:
1835 1.1 skrll if (operand[argn].mode != ABS16SRC)
1836 1.1 skrll {
1837 1.1 skrll as_bad (_("source operand must be 16bit absolute address"));
1838 1.1 skrll return;
1839 1.1 skrll }
1840 1.1 skrll break;
1841 1.1 skrll
1842 1.1 skrll }
1843 1.1 skrll }
1844 1.1 skrll }
1845 1.1 skrll as_bad (_("invalid operands"));
1846 1.1 skrll }
1847 1.1 skrll
1848 1.1 skrll
1849 1.1 skrll /* If OPERAND is part of an address, adjust its size and value given
1850 1.1 skrll that it addresses SIZE bytes.
1851 1.1 skrll
1852 1.1 skrll This function decides how big non-immediate constants are when no
1853 1.1 skrll size was explicitly given. It also scales down the assembly-level
1854 1.1 skrll displacement in an @(d:2,ERn) operand. */
1855 1.1 skrll
1856 1.1 skrll static void
1857 1.1 skrll fix_operand_size (struct h8_op *operand, int size)
1858 1.1 skrll {
1859 1.1 skrll if (SXmode && (operand->mode & MODE) == DISP)
1860 1.1 skrll {
1861 1.1 skrll /* If the user didn't specify an operand width, see if we
1862 1.1 skrll can use @(d:2,ERn). */
1863 1.1 skrll if ((operand->mode & SIZE) == 0
1864 1.1 skrll && operand->exp.X_add_symbol == 0
1865 1.1 skrll && operand->exp.X_op_symbol == 0
1866 1.1 skrll && (operand->exp.X_add_number == size
1867 1.1 skrll || operand->exp.X_add_number == size * 2
1868 1.1 skrll || operand->exp.X_add_number == size * 3))
1869 1.1 skrll operand->mode |= L_2;
1870 1.1 skrll
1871 1.1 skrll /* Scale down the displacement in an @(d:2,ERn) operand.
1872 1.1 skrll X_add_number then contains the desired field value. */
1873 1.1 skrll if ((operand->mode & SIZE) == L_2)
1874 1.1 skrll {
1875 1.1 skrll if (operand->exp.X_add_number % size != 0)
1876 1.1 skrll as_warn (_("operand/size mis-match"));
1877 1.1 skrll operand->exp.X_add_number /= size;
1878 1.1 skrll }
1879 1.1 skrll }
1880 1.1 skrll
1881 1.1 skrll if ((operand->mode & SIZE) == 0)
1882 1.1 skrll switch (operand->mode & MODE)
1883 1.1 skrll {
1884 1.1 skrll case DISP:
1885 1.1 skrll case INDEXB:
1886 1.1 skrll case INDEXW:
1887 1.1 skrll case INDEXL:
1888 1.1 skrll case ABS:
1889 1.1 skrll /* Pick a 24-bit address unless we know that a 16-bit address
1890 1.1 skrll is safe. get_specific() will relax L_24 into L_32 where
1891 1.1 skrll necessary. */
1892 1.1 skrll if (Hmode
1893 1.1.1.4 christos && !Nmode
1894 1.1.1.3 christos && ((((addressT) operand->exp.X_add_number + 0x8000)
1895 1.1.1.3 christos & 0xffffffff) > 0xffff
1896 1.1 skrll || operand->exp.X_add_symbol != 0
1897 1.1 skrll || operand->exp.X_op_symbol != 0))
1898 1.1 skrll operand->mode |= L_24;
1899 1.1 skrll else
1900 1.1 skrll operand->mode |= L_16;
1901 1.1 skrll break;
1902 1.1 skrll
1903 1.1 skrll case PCREL:
1904 1.1.1.3 christos if ((((addressT) operand->exp.X_add_number + 0x80)
1905 1.1.1.3 christos & 0xffffffff) <= 0xff)
1906 1.1 skrll {
1907 1.1 skrll if (operand->exp.X_add_symbol != NULL)
1908 1.1 skrll operand->mode |= bsize;
1909 1.1 skrll else
1910 1.1 skrll operand->mode |= L_8;
1911 1.1 skrll }
1912 1.1 skrll else
1913 1.1 skrll operand->mode |= L_16;
1914 1.1 skrll break;
1915 1.1 skrll }
1916 1.1 skrll }
1917 1.1 skrll
1918 1.1 skrll
1919 1.1 skrll /* This is the guts of the machine-dependent assembler. STR points to
1920 1.1 skrll a machine dependent instruction. This function is supposed to emit
1921 1.1 skrll the frags/bytes it assembles. */
1922 1.1 skrll
1923 1.1 skrll void
1924 1.1 skrll md_assemble (char *str)
1925 1.1 skrll {
1926 1.1 skrll char *op_start;
1927 1.1 skrll char *op_end;
1928 1.1 skrll struct h8_op operand[3];
1929 1.1 skrll const struct h8_instruction *instruction;
1930 1.1 skrll const struct h8_instruction *prev_instruction;
1931 1.1 skrll
1932 1.1 skrll char *dot = 0;
1933 1.1 skrll char *slash = 0;
1934 1.1 skrll char c;
1935 1.1 skrll int size, i;
1936 1.1 skrll
1937 1.1 skrll /* Drop leading whitespace. */
1938 1.1 skrll while (*str == ' ')
1939 1.1 skrll str++;
1940 1.1 skrll
1941 1.1 skrll /* Find the op code end. */
1942 1.1 skrll for (op_start = op_end = str;
1943 1.1 skrll *op_end != 0 && *op_end != ' ';
1944 1.1 skrll op_end++)
1945 1.1 skrll {
1946 1.1 skrll if (*op_end == '.')
1947 1.1 skrll {
1948 1.1 skrll dot = op_end + 1;
1949 1.1 skrll *op_end = 0;
1950 1.1 skrll op_end += 2;
1951 1.1 skrll break;
1952 1.1 skrll }
1953 1.1 skrll else if (*op_end == '/' && ! slash)
1954 1.1 skrll slash = op_end;
1955 1.1 skrll }
1956 1.1 skrll
1957 1.1 skrll if (op_end == op_start)
1958 1.1 skrll {
1959 1.1 skrll as_bad (_("can't find opcode "));
1960 1.1 skrll }
1961 1.1 skrll c = *op_end;
1962 1.1 skrll
1963 1.1 skrll *op_end = 0;
1964 1.1 skrll
1965 1.1 skrll /* The assembler stops scanning the opcode at slashes, so it fails
1966 1.1 skrll to make characters following them lower case. Fix them. */
1967 1.1 skrll if (slash)
1968 1.1 skrll while (*++slash)
1969 1.1 skrll *slash = TOLOWER (*slash);
1970 1.1 skrll
1971 1.1 skrll instruction = (const struct h8_instruction *)
1972 1.1 skrll hash_find (opcode_hash_control, op_start);
1973 1.1 skrll
1974 1.1 skrll if (instruction == NULL)
1975 1.1 skrll {
1976 1.1 skrll as_bad (_("unknown opcode"));
1977 1.1 skrll return;
1978 1.1 skrll }
1979 1.1 skrll
1980 1.1 skrll /* We used to set input_line_pointer to the result of get_operands,
1981 1.1 skrll but that is wrong. Our caller assumes we don't change it. */
1982 1.1 skrll
1983 1.1 skrll operand[0].mode = 0;
1984 1.1 skrll operand[1].mode = 0;
1985 1.1 skrll operand[2].mode = 0;
1986 1.1 skrll
1987 1.1 skrll if (OP_KIND (instruction->opcode->how) == O_MOVAB
1988 1.1 skrll || OP_KIND (instruction->opcode->how) == O_MOVAW
1989 1.1 skrll || OP_KIND (instruction->opcode->how) == O_MOVAL)
1990 1.1 skrll get_mova_operands (op_end, operand);
1991 1.1 skrll else if (OP_KIND (instruction->opcode->how) == O_RTEL
1992 1.1 skrll || OP_KIND (instruction->opcode->how) == O_RTSL)
1993 1.1 skrll get_rtsl_operands (op_end, operand);
1994 1.1 skrll else
1995 1.1 skrll get_operands (instruction->noperands, op_end, operand);
1996 1.1 skrll
1997 1.1 skrll *op_end = c;
1998 1.1 skrll prev_instruction = instruction;
1999 1.1 skrll
2000 1.1 skrll /* Now we have operands from instruction.
2001 1.1 skrll Let's check them out for ldm and stm. */
2002 1.1 skrll if (OP_KIND (instruction->opcode->how) == O_LDM)
2003 1.1 skrll {
2004 1.1 skrll /* The first operand must be @er7+, and the
2005 1.1 skrll second operand must be a register pair. */
2006 1.1 skrll if ((operand[0].mode != RSINC)
2007 1.1 skrll || (operand[0].reg != 7)
2008 1.1 skrll || ((operand[1].reg & 0x80000000) == 0))
2009 1.1 skrll as_bad (_("invalid operand in ldm"));
2010 1.1 skrll }
2011 1.1 skrll else if (OP_KIND (instruction->opcode->how) == O_STM)
2012 1.1 skrll {
2013 1.1 skrll /* The first operand must be a register pair,
2014 1.1 skrll and the second operand must be @-er7. */
2015 1.1 skrll if (((operand[0].reg & 0x80000000) == 0)
2016 1.1 skrll || (operand[1].mode != RDDEC)
2017 1.1 skrll || (operand[1].reg != 7))
2018 1.1 skrll as_bad (_("invalid operand in stm"));
2019 1.1 skrll }
2020 1.1 skrll
2021 1.1 skrll size = SN;
2022 1.1 skrll if (dot)
2023 1.1 skrll {
2024 1.1 skrll switch (TOLOWER (*dot))
2025 1.1 skrll {
2026 1.1 skrll case 'b':
2027 1.1 skrll size = SB;
2028 1.1 skrll break;
2029 1.1 skrll
2030 1.1 skrll case 'w':
2031 1.1 skrll size = SW;
2032 1.1 skrll break;
2033 1.1 skrll
2034 1.1 skrll case 'l':
2035 1.1 skrll size = SL;
2036 1.1 skrll break;
2037 1.1 skrll }
2038 1.1 skrll }
2039 1.1 skrll if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
2040 1.1 skrll OP_KIND (instruction->opcode->how) == O_MOVAW ||
2041 1.1 skrll OP_KIND (instruction->opcode->how) == O_MOVAL)
2042 1.1 skrll {
2043 1.1 skrll switch (operand[0].mode & MODE)
2044 1.1 skrll {
2045 1.1 skrll case INDEXB:
2046 1.1 skrll default:
2047 1.1 skrll fix_operand_size (&operand[1], 1);
2048 1.1 skrll break;
2049 1.1 skrll case INDEXW:
2050 1.1 skrll fix_operand_size (&operand[1], 2);
2051 1.1 skrll break;
2052 1.1 skrll case INDEXL:
2053 1.1 skrll fix_operand_size (&operand[1], 4);
2054 1.1 skrll break;
2055 1.1 skrll }
2056 1.1 skrll }
2057 1.1 skrll else
2058 1.1 skrll {
2059 1.1 skrll for (i = 0; i < 3 && operand[i].mode != 0; i++)
2060 1.1 skrll switch (size)
2061 1.1 skrll {
2062 1.1 skrll case SN:
2063 1.1 skrll case SB:
2064 1.1 skrll default:
2065 1.1 skrll fix_operand_size (&operand[i], 1);
2066 1.1 skrll break;
2067 1.1 skrll case SW:
2068 1.1 skrll fix_operand_size (&operand[i], 2);
2069 1.1 skrll break;
2070 1.1 skrll case SL:
2071 1.1 skrll fix_operand_size (&operand[i], 4);
2072 1.1 skrll break;
2073 1.1 skrll }
2074 1.1 skrll }
2075 1.1 skrll
2076 1.1 skrll instruction = get_specific (instruction, operand, size);
2077 1.1 skrll
2078 1.1 skrll if (instruction == 0)
2079 1.1 skrll {
2080 1.1 skrll /* Couldn't find an opcode which matched the operands. */
2081 1.1 skrll char *where = frag_more (2);
2082 1.1 skrll
2083 1.1 skrll where[0] = 0x0;
2084 1.1 skrll where[1] = 0x0;
2085 1.1 skrll clever_message (prev_instruction, operand);
2086 1.1 skrll
2087 1.1 skrll return;
2088 1.1 skrll }
2089 1.1 skrll
2090 1.1 skrll build_bytes (instruction, operand);
2091 1.1 skrll
2092 1.1 skrll dwarf2_emit_insn (instruction->length);
2093 1.1 skrll }
2094 1.1 skrll
2095 1.1 skrll symbolS *
2096 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2097 1.1 skrll {
2098 1.1 skrll return 0;
2099 1.1 skrll }
2100 1.1 skrll
2101 1.1 skrll /* Various routines to kill one day. */
2102 1.1 skrll
2103 1.1.1.5 christos const char *
2104 1.1 skrll md_atof (int type, char *litP, int *sizeP)
2105 1.1 skrll {
2106 1.1 skrll return ieee_md_atof (type, litP, sizeP, TRUE);
2107 1.1 skrll }
2108 1.1 skrll
2109 1.1 skrll #define OPTION_H_TICK_HEX (OPTION_MD_BASE)
2111 1.1 skrll #define OPTION_MACH (OPTION_MD_BASE+1)
2112 1.1 skrll
2113 1.1.1.4 christos const char *md_shortopts = "";
2114 1.1.1.4 christos struct option md_longopts[] =
2115 1.1 skrll {
2116 1.1.1.4 christos { "h-tick-hex", no_argument, NULL, OPTION_H_TICK_HEX },
2117 1.1 skrll { "mach", required_argument, NULL, OPTION_MACH },
2118 1.1 skrll {NULL, no_argument, NULL, 0}
2119 1.1 skrll };
2120 1.1 skrll
2121 1.1 skrll size_t md_longopts_size = sizeof (md_longopts);
2122 1.1.1.4 christos
2123 1.1.1.4 christos struct mach_func
2124 1.1.1.4 christos {
2125 1.1.1.4 christos const char *name;
2126 1.1.1.4 christos void (*func) (void);
2127 1.1.1.4 christos };
2128 1.1.1.4 christos
2129 1.1.1.4 christos static void
2130 1.1.1.4 christos mach_h8300h (void)
2131 1.1.1.4 christos {
2132 1.1.1.4 christos Hmode = 1;
2133 1.1.1.4 christos Smode = 0;
2134 1.1.1.4 christos Nmode = 0;
2135 1.1.1.4 christos SXmode = 0;
2136 1.1.1.4 christos default_mach = bfd_mach_h8300h;
2137 1.1.1.4 christos }
2138 1.1.1.4 christos
2139 1.1.1.4 christos static void
2140 1.1.1.4 christos mach_h8300hn (void)
2141 1.1.1.4 christos {
2142 1.1.1.4 christos Hmode = 1;
2143 1.1.1.4 christos Smode = 0;
2144 1.1.1.4 christos Nmode = 1;
2145 1.1.1.4 christos SXmode = 0;
2146 1.1.1.4 christos default_mach = bfd_mach_h8300hn;
2147 1.1.1.4 christos }
2148 1.1.1.4 christos
2149 1.1.1.4 christos static void
2150 1.1.1.4 christos mach_h8300s (void)
2151 1.1.1.4 christos {
2152 1.1.1.4 christos Hmode = 1;
2153 1.1.1.4 christos Smode = 1;
2154 1.1.1.4 christos Nmode = 0;
2155 1.1.1.4 christos SXmode = 0;
2156 1.1.1.4 christos default_mach = bfd_mach_h8300s;
2157 1.1.1.4 christos }
2158 1.1.1.4 christos
2159 1.1.1.4 christos static void
2160 1.1.1.4 christos mach_h8300sn (void)
2161 1.1.1.4 christos {
2162 1.1.1.4 christos Hmode = 1;
2163 1.1.1.4 christos Smode = 1;
2164 1.1.1.4 christos Nmode = 1;
2165 1.1.1.4 christos SXmode = 0;
2166 1.1.1.4 christos default_mach = bfd_mach_h8300sn;
2167 1.1.1.4 christos }
2168 1.1.1.4 christos
2169 1.1.1.4 christos static void
2170 1.1.1.4 christos mach_h8300sx (void)
2171 1.1.1.4 christos {
2172 1.1.1.4 christos Hmode = 1;
2173 1.1.1.4 christos Smode = 1;
2174 1.1.1.4 christos Nmode = 0;
2175 1.1.1.4 christos SXmode = 1;
2176 1.1.1.4 christos default_mach = bfd_mach_h8300sx;
2177 1.1.1.4 christos }
2178 1.1.1.4 christos
2179 1.1.1.4 christos static void
2180 1.1.1.4 christos mach_h8300sxn (void)
2181 1.1.1.4 christos {
2182 1.1.1.4 christos Hmode = 1;
2183 1.1.1.4 christos Smode = 1;
2184 1.1.1.4 christos Nmode = 1;
2185 1.1.1.4 christos SXmode = 1;
2186 1.1.1.4 christos default_mach = bfd_mach_h8300sxn;
2187 1.1.1.4 christos }
2188 1.1.1.4 christos
2189 1.1.1.4 christos const struct mach_func mach_table[] =
2190 1.1.1.4 christos {
2191 1.1.1.4 christos {"h8300h", mach_h8300h},
2192 1.1.1.4 christos {"h8300hn", mach_h8300hn},
2193 1.1.1.4 christos {"h8300s", mach_h8300s},
2194 1.1.1.4 christos {"h8300sn", mach_h8300sn},
2195 1.1.1.4 christos {"h8300sx", mach_h8300sx},
2196 1.1.1.4 christos {"h8300sxn", mach_h8300sxn}
2197 1.1.1.4 christos };
2198 1.1 skrll
2199 1.1.1.5 christos int
2200 1.1 skrll md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
2201 1.1.1.4 christos {
2202 1.1 skrll unsigned int i;
2203 1.1 skrll switch (c)
2204 1.1 skrll {
2205 1.1 skrll case OPTION_H_TICK_HEX:
2206 1.1 skrll enable_h_tick_hex = 1;
2207 1.1.1.4 christos break;
2208 1.1.1.4 christos case OPTION_MACH:
2209 1.1.1.4 christos for (i = 0; i < sizeof(mach_table) / sizeof(struct mach_func); i++)
2210 1.1.1.4 christos {
2211 1.1.1.4 christos if (strcasecmp (arg, mach_table[i].name) == 0)
2212 1.1.1.4 christos {
2213 1.1.1.4 christos mach_table[i].func();
2214 1.1.1.4 christos break;
2215 1.1.1.4 christos }
2216 1.1.1.4 christos }
2217 1.1.1.4 christos if (i >= sizeof(mach_table) / sizeof(struct mach_func))
2218 1.1.1.4 christos as_bad (_("Invalid argument to --mach option: %s"), arg);
2219 1.1 skrll break;
2220 1.1 skrll default:
2221 1.1 skrll return 0;
2222 1.1 skrll }
2223 1.1 skrll return 1;
2224 1.1 skrll }
2225 1.1 skrll
2226 1.1.1.4 christos void
2227 1.1 skrll md_show_usage (FILE *stream)
2228 1.1.1.4 christos {
2229 1.1.1.4 christos fprintf (stream, _(" H8300-specific assembler options:\n"));
2230 1.1.1.4 christos fprintf (stream, _("\
2231 1.1.1.4 christos -mach=<name> Set the H8300 machine type to one of:\n\
2232 1.1.1.4 christos h8300h, h8300hn, h8300s, h8300sn, h8300sx, h8300sxn\n"));
2233 1.1.1.4 christos fprintf (stream, _("\
2234 1.1 skrll -h-tick-hex Support H'00 style hex constants\n"));
2235 1.1 skrll }
2236 1.1 skrll
2237 1.1 skrll void tc_aout_fix_to_chars (void);
2239 1.1 skrll
2240 1.1 skrll void
2241 1.1 skrll tc_aout_fix_to_chars (void)
2242 1.1 skrll {
2243 1.1 skrll printf (_("call to tc_aout_fix_to_chars \n"));
2244 1.1 skrll abort ();
2245 1.1 skrll }
2246 1.1 skrll
2247 1.1 skrll void
2248 1.1 skrll md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
2249 1.1 skrll segT seg ATTRIBUTE_UNUSED,
2250 1.1 skrll fragS *fragP ATTRIBUTE_UNUSED)
2251 1.1 skrll {
2252 1.1 skrll printf (_("call to md_convert_frag \n"));
2253 1.1 skrll abort ();
2254 1.1 skrll }
2255 1.1 skrll
2256 1.1 skrll valueT
2257 1.1 skrll md_section_align (segT segment, valueT size)
2258 1.1.1.4 christos {
2259 1.1 skrll int align = bfd_get_section_alignment (stdoutput, segment);
2260 1.1 skrll return ((size + (1 << align) - 1) & (-1U << align));
2261 1.1 skrll }
2262 1.1 skrll
2263 1.1 skrll void
2264 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2265 1.1 skrll {
2266 1.1 skrll char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2267 1.1 skrll long val = *valP;
2268 1.1 skrll
2269 1.1 skrll switch (fixP->fx_size)
2270 1.1 skrll {
2271 1.1 skrll case 1:
2272 1.1 skrll *buf++ = val;
2273 1.1 skrll break;
2274 1.1 skrll case 2:
2275 1.1 skrll *buf++ = (val >> 8);
2276 1.1 skrll *buf++ = val;
2277 1.1 skrll break;
2278 1.1 skrll case 4:
2279 1.1 skrll *buf++ = (val >> 24);
2280 1.1 skrll *buf++ = (val >> 16);
2281 1.1 skrll *buf++ = (val >> 8);
2282 1.1 skrll *buf++ = val;
2283 1.1 skrll break;
2284 1.1 skrll case 8:
2285 1.1 skrll /* This can arise when the .quad or .8byte pseudo-ops are used.
2286 1.1 skrll Returning here (without setting fx_done) will cause the code
2287 1.1 skrll to attempt to generate a reloc which will then fail with the
2288 1.1 skrll slightly more helpful error message: "Cannot represent
2289 1.1 skrll relocation type BFD_RELOC_64". */
2290 1.1 skrll return;
2291 1.1 skrll default:
2292 1.1 skrll abort ();
2293 1.1 skrll }
2294 1.1 skrll
2295 1.1 skrll if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2296 1.1 skrll fixP->fx_done = 1;
2297 1.1 skrll }
2298 1.1 skrll
2299 1.1 skrll int
2300 1.1 skrll md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
2301 1.1 skrll segT segment_type ATTRIBUTE_UNUSED)
2302 1.1 skrll {
2303 1.1 skrll printf (_("call to md_estimate_size_before_relax \n"));
2304 1.1 skrll abort ();
2305 1.1 skrll }
2306 1.1 skrll
2307 1.1 skrll /* Put number into target byte order. */
2308 1.1 skrll void
2309 1.1 skrll md_number_to_chars (char *ptr, valueT use, int nbytes)
2310 1.1 skrll {
2311 1.1 skrll number_to_chars_bigendian (ptr, use, nbytes);
2312 1.1 skrll }
2313 1.1.1.2 christos
2314 1.1 skrll long
2315 1.1.1.2 christos md_pcrel_from (fixS *fixp)
2316 1.1.1.2 christos {
2317 1.1.1.2 christos as_bad_where (fixp->fx_file, fixp->fx_line,
2318 1.1 skrll _("Unexpected reference to a symbol in a non-code section"));
2319 1.1 skrll return 0;
2320 1.1 skrll }
2321 1.1 skrll
2322 1.1 skrll arelent *
2323 1.1 skrll tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2324 1.1 skrll {
2325 1.1 skrll arelent *rel;
2326 1.1 skrll bfd_reloc_code_real_type r_type;
2327 1.1 skrll
2328 1.1 skrll if (fixp->fx_addsy && fixp->fx_subsy)
2329 1.1 skrll {
2330 1.1 skrll if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2331 1.1 skrll || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2332 1.1 skrll {
2333 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
2334 1.1 skrll _("Difference of symbols in different sections is not supported"));
2335 1.1 skrll return NULL;
2336 1.1 skrll }
2337 1.1.1.5 christos }
2338 1.1.1.5 christos
2339 1.1 skrll rel = XNEW (arelent);
2340 1.1 skrll rel->sym_ptr_ptr = XNEW (asymbol *);
2341 1.1 skrll *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2342 1.1 skrll rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2343 1.1 skrll rel->addend = fixp->fx_offset;
2344 1.1 skrll
2345 1.1 skrll r_type = fixp->fx_r_type;
2346 1.1 skrll
2347 1.1 skrll #define DEBUG 0
2348 1.1 skrll #if DEBUG
2349 1.1 skrll fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2350 1.1 skrll fflush (stderr);
2351 1.1 skrll #endif
2352 1.1 skrll rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2353 1.1 skrll if (rel->howto == NULL)
2354 1.1 skrll {
2355 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
2356 1.1 skrll _("Cannot represent relocation type %s"),
2357 1.1 skrll bfd_get_reloc_code_name (r_type));
2358 1.1 skrll return NULL;
2359 1.1 skrll }
2360 1.1 skrll
2361 return rel;
2362 }
2363