1 /* Disassemble MN10300 instructions.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
17
18
19 #include <stdio.h>
20
21 #include "sysdep.h"
22 #include "opcode/mn10300.h"
23 #include "dis-asm.h"
24 #include "opintl.h"
25
26 static void disassemble PARAMS ((bfd_vma, struct disassemble_info *,
27 unsigned long insn, unsigned int));
28
29 #define HAVE_AM33_2 (info->mach == AM33_2)
30 #define HAVE_AM33 (info->mach == AM33 || HAVE_AM33_2)
31 #define HAVE_AM30 (info->mach == AM30)
32
33 int
print_insn_mn10300(memaddr,info)34 print_insn_mn10300 (memaddr, info)
35 bfd_vma memaddr;
36 struct disassemble_info *info;
37 {
38 int status;
39 bfd_byte buffer[4];
40 unsigned long insn;
41 unsigned int consume;
42
43 /* First figure out how big the opcode is. */
44 status = (*info->read_memory_func) (memaddr, buffer, 1, info);
45 if (status != 0)
46 {
47 (*info->memory_error_func) (status, memaddr, info);
48 return -1;
49 }
50 insn = *(unsigned char *) buffer;
51
52 /* These are one byte insns. */
53 if ((insn & 0xf3) == 0x00
54 || (insn & 0xf0) == 0x10
55 || (insn & 0xfc) == 0x3c
56 || (insn & 0xf3) == 0x41
57 || (insn & 0xf3) == 0x40
58 || (insn & 0xfc) == 0x50
59 || (insn & 0xfc) == 0x54
60 || (insn & 0xf0) == 0x60
61 || (insn & 0xf0) == 0x70
62 || ((insn & 0xf0) == 0x80
63 && (insn & 0x0c) >> 2 != (insn & 0x03))
64 || ((insn & 0xf0) == 0x90
65 && (insn & 0x0c) >> 2 != (insn & 0x03))
66 || ((insn & 0xf0) == 0xa0
67 && (insn & 0x0c) >> 2 != (insn & 0x03))
68 || ((insn & 0xf0) == 0xb0
69 && (insn & 0x0c) >> 2 != (insn & 0x03))
70 || (insn & 0xff) == 0xcb
71 || (insn & 0xfc) == 0xd0
72 || (insn & 0xfc) == 0xd4
73 || (insn & 0xfc) == 0xd8
74 || (insn & 0xf0) == 0xe0
75 || (insn & 0xff) == 0xff)
76 {
77 consume = 1;
78 }
79
80 /* These are two byte insns. */
81 else if ((insn & 0xf0) == 0x80
82 || (insn & 0xf0) == 0x90
83 || (insn & 0xf0) == 0xa0
84 || (insn & 0xf0) == 0xb0
85 || (insn & 0xfc) == 0x20
86 || (insn & 0xfc) == 0x28
87 || (insn & 0xf3) == 0x43
88 || (insn & 0xf3) == 0x42
89 || (insn & 0xfc) == 0x58
90 || (insn & 0xfc) == 0x5c
91 || ((insn & 0xf0) == 0xc0
92 && (insn & 0xff) != 0xcb
93 && (insn & 0xff) != 0xcc
94 && (insn & 0xff) != 0xcd)
95 || (insn & 0xff) == 0xf0
96 || (insn & 0xff) == 0xf1
97 || (insn & 0xff) == 0xf2
98 || (insn & 0xff) == 0xf3
99 || (insn & 0xff) == 0xf4
100 || (insn & 0xff) == 0xf5
101 || (insn & 0xff) == 0xf6)
102 {
103 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
104 if (status != 0)
105 {
106 (*info->memory_error_func) (status, memaddr, info);
107 return -1;
108 }
109 insn = bfd_getb16 (buffer);
110 consume = 2;
111 }
112
113 /* These are three byte insns. */
114 else if ((insn & 0xff) == 0xf8
115 || (insn & 0xff) == 0xcc
116 || (insn & 0xff) == 0xf9
117 || (insn & 0xf3) == 0x01
118 || (insn & 0xf3) == 0x02
119 || (insn & 0xf3) == 0x03
120 || (insn & 0xfc) == 0x24
121 || (insn & 0xfc) == 0x2c
122 || (insn & 0xfc) == 0x30
123 || (insn & 0xfc) == 0x34
124 || (insn & 0xfc) == 0x38
125 || (insn & 0xff) == 0xde
126 || (insn & 0xff) == 0xdf
127 || (insn & 0xff) == 0xf9
128 || (insn & 0xff) == 0xcc)
129 {
130 status = (*info->read_memory_func) (memaddr, buffer, 2, info);
131 if (status != 0)
132 {
133 (*info->memory_error_func) (status, memaddr, info);
134 return -1;
135 }
136 insn = bfd_getb16 (buffer);
137 insn <<= 8;
138 status = (*info->read_memory_func) (memaddr + 2, buffer, 1, info);
139 if (status != 0)
140 {
141 (*info->memory_error_func) (status, memaddr, info);
142 return -1;
143 }
144 insn |= *(unsigned char *) buffer;
145 consume = 3;
146 }
147
148 /* These are four byte insns. */
149 else if ((insn & 0xff) == 0xfa
150 || (insn & 0xff) == 0xf7
151 || (insn & 0xff) == 0xfb)
152 {
153 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
154 if (status != 0)
155 {
156 (*info->memory_error_func) (status, memaddr, info);
157 return -1;
158 }
159 insn = bfd_getb32 (buffer);
160 consume = 4;
161 }
162
163 /* These are five byte insns. */
164 else if ((insn & 0xff) == 0xcd
165 || (insn & 0xff) == 0xdc)
166 {
167 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
168 if (status != 0)
169 {
170 (*info->memory_error_func) (status, memaddr, info);
171 return -1;
172 }
173 insn = bfd_getb32 (buffer);
174 consume = 5;
175 }
176
177 /* These are six byte insns. */
178 else if ((insn & 0xff) == 0xfd
179 || (insn & 0xff) == 0xfc)
180 {
181 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
182 if (status != 0)
183 {
184 (*info->memory_error_func) (status, memaddr, info);
185 return -1;
186 }
187
188 insn = bfd_getb32 (buffer);
189 consume = 6;
190 }
191
192 /* Else its a seven byte insns (in theory). */
193 else
194 {
195 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
196 if (status != 0)
197 {
198 (*info->memory_error_func) (status, memaddr, info);
199 return -1;
200 }
201
202 insn = bfd_getb32 (buffer);
203 consume = 7;
204 /* Handle the 5-byte extended instruction codes. */
205 if ((insn & 0xfff80000) == 0xfe800000)
206 consume = 5;
207 }
208
209 disassemble (memaddr, info, insn, consume);
210
211 return consume;
212 }
213
214 static void
disassemble(memaddr,info,insn,size)215 disassemble (memaddr, info, insn, size)
216 bfd_vma memaddr;
217 struct disassemble_info *info;
218 unsigned long insn;
219 unsigned int size;
220 {
221 struct mn10300_opcode *op = (struct mn10300_opcode *)mn10300_opcodes;
222 const struct mn10300_operand *operand;
223 bfd_byte buffer[4];
224 unsigned long extension = 0;
225 int status, match = 0;
226
227 /* Find the opcode. */
228 while (op->name)
229 {
230 int mysize, extra_shift;
231
232 if (op->format == FMT_S0)
233 mysize = 1;
234 else if (op->format == FMT_S1
235 || op->format == FMT_D0)
236 mysize = 2;
237 else if (op->format == FMT_S2
238 || op->format == FMT_D1)
239 mysize = 3;
240 else if (op->format == FMT_S4)
241 mysize = 5;
242 else if (op->format == FMT_D2)
243 mysize = 4;
244 else if (op->format == FMT_D3)
245 mysize = 5;
246 else if (op->format == FMT_D4)
247 mysize = 6;
248 else if (op->format == FMT_D6)
249 mysize = 3;
250 else if (op->format == FMT_D7 || op->format == FMT_D10)
251 mysize = 4;
252 else if (op->format == FMT_D8)
253 mysize = 6;
254 else if (op->format == FMT_D9)
255 mysize = 7;
256 else
257 mysize = 7;
258
259 if ((op->mask & insn) == op->opcode
260 && size == (unsigned int) mysize
261 && (op->machine == 0
262 || (op->machine == AM33_2 && HAVE_AM33_2)
263 || (op->machine == AM33 && HAVE_AM33)
264 || (op->machine == AM30 && HAVE_AM30)))
265 {
266 const unsigned char *opindex_ptr;
267 unsigned int nocomma;
268 int paren = 0;
269
270 if (op->format == FMT_D1 || op->format == FMT_S1)
271 extra_shift = 8;
272 else if (op->format == FMT_D2 || op->format == FMT_D4
273 || op->format == FMT_S2 || op->format == FMT_S4
274 || op->format == FMT_S6 || op->format == FMT_D5)
275 extra_shift = 16;
276 else if (op->format == FMT_D7
277 || op->format == FMT_D8
278 || op->format == FMT_D9)
279 extra_shift = 8;
280 else
281 extra_shift = 0;
282
283 if (size == 1 || size == 2)
284 {
285 extension = 0;
286 }
287 else if (size == 3
288 && (op->format == FMT_D1
289 || op->opcode == 0xdf0000
290 || op->opcode == 0xde0000))
291 {
292 extension = 0;
293 }
294 else if (size == 3
295 && op->format == FMT_D6)
296 {
297 extension = 0;
298 }
299 else if (size == 3)
300 {
301 insn &= 0xff0000;
302 status = (*info->read_memory_func) (memaddr + 1, buffer, 2, info);
303 if (status != 0)
304 {
305 (*info->memory_error_func) (status, memaddr, info);
306 return;
307 }
308
309 insn |= bfd_getl16 (buffer);
310 extension = 0;
311 }
312 else if (size == 4
313 && (op->opcode == 0xfaf80000
314 || op->opcode == 0xfaf00000
315 || op->opcode == 0xfaf40000))
316 {
317 extension = 0;
318 }
319 else if (size == 4
320 && (op->format == FMT_D7
321 || op->format == FMT_D10))
322 {
323 extension = 0;
324 }
325 else if (size == 4)
326 {
327 insn &= 0xffff0000;
328 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
329 if (status != 0)
330 {
331 (*info->memory_error_func) (status, memaddr, info);
332 return;
333 }
334
335 insn |= bfd_getl16 (buffer);
336 extension = 0;
337 }
338 else if (size == 5 && op->opcode == 0xdc000000)
339 {
340 unsigned long temp = 0;
341 status = (*info->read_memory_func) (memaddr + 1, buffer, 4, info);
342 if (status != 0)
343 {
344 (*info->memory_error_func) (status, memaddr, info);
345 return;
346 }
347 temp |= bfd_getl32 (buffer);
348
349 insn &= 0xff000000;
350 insn |= (temp & 0xffffff00) >> 8;
351 extension = temp & 0xff;
352 }
353 else if (size == 5 && op->format == FMT_D3)
354 {
355 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
356 if (status != 0)
357 {
358 (*info->memory_error_func) (status, memaddr, info);
359 return;
360 }
361 insn &= 0xffff0000;
362 insn |= bfd_getl16 (buffer);
363
364 status = (*info->read_memory_func) (memaddr + 4, buffer, 1, info);
365 if (status != 0)
366 {
367 (*info->memory_error_func) (status, memaddr, info);
368 return;
369 }
370 extension = *(unsigned char *) buffer;
371 }
372 else if (size == 5)
373 {
374 unsigned long temp = 0;
375 status = (*info->read_memory_func) (memaddr + 1, buffer, 2, info);
376 if (status != 0)
377 {
378 (*info->memory_error_func) (status, memaddr, info);
379 return;
380 }
381 temp |= bfd_getl16 (buffer);
382
383 insn &= 0xff0000ff;
384 insn |= temp << 8;
385
386 status = (*info->read_memory_func) (memaddr + 4, buffer, 1, info);
387 if (status != 0)
388 {
389 (*info->memory_error_func) (status, memaddr, info);
390 return;
391 }
392 extension = *(unsigned char *) buffer;
393 }
394 else if (size == 6 && op->format == FMT_D8)
395 {
396 insn &= 0xffffff00;
397 status = (*info->read_memory_func) (memaddr + 5, buffer, 1, info);
398 if (status != 0)
399 {
400 (*info->memory_error_func) (status, memaddr, info);
401 return;
402 }
403 insn |= *(unsigned char *) buffer;
404
405 status = (*info->read_memory_func) (memaddr + 3, buffer, 2, info);
406 if (status != 0)
407 {
408 (*info->memory_error_func) (status, memaddr, info);
409 return;
410 }
411 extension = bfd_getl16 (buffer);
412 }
413 else if (size == 6)
414 {
415 unsigned long temp = 0;
416 status = (*info->read_memory_func) (memaddr + 2, buffer, 4, info);
417 if (status != 0)
418 {
419 (*info->memory_error_func) (status, memaddr, info);
420 return;
421 }
422 temp |= bfd_getl32 (buffer);
423
424 insn &= 0xffff0000;
425 insn |= (temp >> 16) & 0xffff;
426 extension = temp & 0xffff;
427 }
428 else if (size == 7 && op->format == FMT_D9)
429 {
430 insn &= 0xffffff00;
431 status = (*info->read_memory_func) (memaddr + 3, buffer, 4, info);
432 if (status != 0)
433 {
434 (*info->memory_error_func) (status, memaddr, info);
435 return;
436 }
437 extension = bfd_getl32 (buffer);
438 insn |= (extension & 0xff000000) >> 24;
439 extension &= 0xffffff;
440 }
441 else if (size == 7 && op->opcode == 0xdd000000)
442 {
443 unsigned long temp = 0;
444 status = (*info->read_memory_func) (memaddr + 1, buffer, 4, info);
445 if (status != 0)
446 {
447 (*info->memory_error_func) (status, memaddr, info);
448 return;
449 }
450 temp |= bfd_getl32 (buffer);
451
452 insn &= 0xff000000;
453 insn |= (temp >> 8) & 0xffffff;
454 extension = (temp & 0xff) << 16;
455
456 status = (*info->read_memory_func) (memaddr + 5, buffer, 2, info);
457 if (status != 0)
458 {
459 (*info->memory_error_func) (status, memaddr, info);
460 return;
461 }
462 extension |= bfd_getb16 (buffer);
463 }
464 else if (size == 7)
465 {
466 unsigned long temp = 0;
467 status = (*info->read_memory_func) (memaddr + 2, buffer, 4, info);
468 if (status != 0)
469 {
470 (*info->memory_error_func) (status, memaddr, info);
471 return;
472 }
473 temp |= bfd_getl32 (buffer);
474
475 insn &= 0xffff0000;
476 insn |= (temp >> 16) & 0xffff;
477 extension = (temp & 0xffff) << 8;
478
479 status = (*info->read_memory_func) (memaddr + 6, buffer, 1, info);
480 if (status != 0)
481 {
482 (*info->memory_error_func) (status, memaddr, info);
483 return;
484 }
485 extension |= *(unsigned char *) buffer;
486 }
487
488 match = 1;
489 (*info->fprintf_func) (info->stream, "%s\t", op->name);
490
491 /* Now print the operands. */
492 for (opindex_ptr = op->operands, nocomma = 1;
493 *opindex_ptr != 0;
494 opindex_ptr++)
495 {
496 unsigned long value;
497
498 operand = &mn10300_operands[*opindex_ptr];
499
500 /* If this operand is a PLUS (autoincrement), then do not emit
501 a comma before emitting the plus. */
502 if ((operand->flags & MN10300_OPERAND_PLUS) != 0)
503 nocomma = 1;
504
505 if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
506 {
507 unsigned long temp;
508 value = insn & ((1 << operand->bits) - 1);
509 value <<= (32 - operand->bits);
510 temp = extension >> operand->shift;
511 temp &= ((1 << (32 - operand->bits)) - 1);
512 value |= temp;
513 value = ((value ^ (((unsigned long) 1) << 31))
514 - (((unsigned long) 1) << 31));
515 }
516 else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
517 {
518 unsigned long temp;
519 value = insn & ((1 << operand->bits) - 1);
520 value <<= (24 - operand->bits);
521 temp = extension >> operand->shift;
522 temp &= ((1 << (24 - operand->bits)) - 1);
523 value |= temp;
524 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
525 value = ((value & 0xffffff) ^ 0x800000) - 0x800000;
526 }
527 else if ((operand->flags & (MN10300_OPERAND_FSREG
528 | MN10300_OPERAND_FDREG)))
529 {
530 /* See m10300-opc.c just before #define FSM0 for an
531 explanation of these variables. Note that
532 FMT-implied shifts are not taken into account for
533 FP registers. */
534 unsigned long mask_low, mask_high;
535 int shl_low, shr_high, shl_high;
536
537 switch (operand->bits)
538 {
539 case 5:
540 /* Handle regular FP registers. */
541 if (operand->shift >= 0)
542 {
543 /* This is an `m' register. */
544 shl_low = operand->shift;
545 shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
546 }
547 else
548 {
549 /* This is an `n' register. */
550 shl_low = -operand->shift;
551 shl_high = shl_low / 4;
552 }
553 mask_low = 0x0f;
554 mask_high = 0x10;
555 shr_high = 4;
556 break;
557
558 case 3:
559 /* Handle accumulators. */
560 shl_low = -operand->shift;
561 shl_high = 0;
562 mask_low = 0x03;
563 mask_high = 0x04;
564 shr_high = 2;
565 break;
566
567 default:
568 abort ();
569 }
570 value = ((((insn >> shl_high) << shr_high) & mask_high)
571 | ((insn >> shl_low) & mask_low));
572 }
573 else if ((operand->flags & MN10300_OPERAND_EXTENDED) != 0)
574 {
575 value = ((extension >> (operand->shift))
576 & ((1 << operand->bits) - 1));
577 }
578 else
579 {
580 value = ((insn >> (operand->shift))
581 & ((1 << operand->bits) - 1));
582 }
583
584 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0
585 /* These are properly extended by the code above. */
586 && ((operand->flags & MN10300_OPERAND_24BIT) == 0))
587 value = ((value ^ (((unsigned long) 1) << (operand->bits - 1)))
588 - (((unsigned long) 1) << (operand->bits - 1)));
589
590 if (!nocomma
591 && (!paren
592 || ((operand->flags & MN10300_OPERAND_PAREN) == 0)))
593 (*info->fprintf_func) (info->stream, ",");
594
595 nocomma = 0;
596
597 if ((operand->flags & MN10300_OPERAND_DREG) != 0)
598 {
599 value = ((insn >> (operand->shift + extra_shift))
600 & ((1 << operand->bits) - 1));
601 (*info->fprintf_func) (info->stream, "d%d", (int) value);
602 }
603
604 else if ((operand->flags & MN10300_OPERAND_AREG) != 0)
605 {
606 value = ((insn >> (operand->shift + extra_shift))
607 & ((1 << operand->bits) - 1));
608 (*info->fprintf_func) (info->stream, "a%d", (int) value);
609 }
610
611 else if ((operand->flags & MN10300_OPERAND_SP) != 0)
612 (*info->fprintf_func) (info->stream, "sp");
613
614 else if ((operand->flags & MN10300_OPERAND_PSW) != 0)
615 (*info->fprintf_func) (info->stream, "psw");
616
617 else if ((operand->flags & MN10300_OPERAND_MDR) != 0)
618 (*info->fprintf_func) (info->stream, "mdr");
619
620 else if ((operand->flags & MN10300_OPERAND_RREG) != 0)
621 {
622 value = ((insn >> (operand->shift + extra_shift))
623 & ((1 << operand->bits) - 1));
624 if (value < 8)
625 (*info->fprintf_func) (info->stream, "r%d", (int) value);
626 else if (value < 12)
627 (*info->fprintf_func) (info->stream, "a%d", (int) value - 8);
628 else
629 (*info->fprintf_func) (info->stream, "d%d", (int) value - 12);
630 }
631
632 else if ((operand->flags & MN10300_OPERAND_XRREG) != 0)
633 {
634 value = ((insn >> (operand->shift + extra_shift))
635 & ((1 << operand->bits) - 1));
636 if (value == 0)
637 (*info->fprintf_func) (info->stream, "sp", value);
638 else
639 (*info->fprintf_func) (info->stream, "xr%d", (int) value);
640 }
641
642 else if ((operand->flags & MN10300_OPERAND_FSREG) != 0)
643 (*info->fprintf_func) (info->stream, "fs%d", (int) value);
644
645 else if ((operand->flags & MN10300_OPERAND_FDREG) != 0)
646 (*info->fprintf_func) (info->stream, "fd%d", (int) value);
647
648 else if ((operand->flags & MN10300_OPERAND_FPCR) != 0)
649 (*info->fprintf_func) (info->stream, "fpcr");
650
651 else if ((operand->flags & MN10300_OPERAND_USP) != 0)
652 (*info->fprintf_func) (info->stream, "usp");
653
654 else if ((operand->flags & MN10300_OPERAND_SSP) != 0)
655 (*info->fprintf_func) (info->stream, "ssp");
656
657 else if ((operand->flags & MN10300_OPERAND_MSP) != 0)
658 (*info->fprintf_func) (info->stream, "msp");
659
660 else if ((operand->flags & MN10300_OPERAND_PC) != 0)
661 (*info->fprintf_func) (info->stream, "pc");
662
663 else if ((operand->flags & MN10300_OPERAND_EPSW) != 0)
664 (*info->fprintf_func) (info->stream, "epsw");
665
666 else if ((operand->flags & MN10300_OPERAND_PLUS) != 0)
667 (*info->fprintf_func) (info->stream, "+");
668
669 else if ((operand->flags & MN10300_OPERAND_PAREN) != 0)
670 {
671 if (paren)
672 (*info->fprintf_func) (info->stream, ")");
673 else
674 {
675 (*info->fprintf_func) (info->stream, "(");
676 nocomma = 1;
677 }
678 paren = !paren;
679 }
680
681 else if ((operand->flags & MN10300_OPERAND_PCREL) != 0)
682 (*info->print_address_func) ((long) value + memaddr, info);
683
684 else if ((operand->flags & MN10300_OPERAND_MEMADDR) != 0)
685 (*info->print_address_func) (value, info);
686
687 else if ((operand->flags & MN10300_OPERAND_REG_LIST) != 0)
688 {
689 int comma = 0;
690
691 (*info->fprintf_func) (info->stream, "[");
692 if (value & 0x80)
693 {
694 (*info->fprintf_func) (info->stream, "d2");
695 comma = 1;
696 }
697
698 if (value & 0x40)
699 {
700 if (comma)
701 (*info->fprintf_func) (info->stream, ",");
702 (*info->fprintf_func) (info->stream, "d3");
703 comma = 1;
704 }
705
706 if (value & 0x20)
707 {
708 if (comma)
709 (*info->fprintf_func) (info->stream, ",");
710 (*info->fprintf_func) (info->stream, "a2");
711 comma = 1;
712 }
713
714 if (value & 0x10)
715 {
716 if (comma)
717 (*info->fprintf_func) (info->stream, ",");
718 (*info->fprintf_func) (info->stream, "a3");
719 comma = 1;
720 }
721
722 if (value & 0x08)
723 {
724 if (comma)
725 (*info->fprintf_func) (info->stream, ",");
726 (*info->fprintf_func) (info->stream, "other");
727 comma = 1;
728 }
729
730 if (value & 0x04)
731 {
732 if (comma)
733 (*info->fprintf_func) (info->stream, ",");
734 (*info->fprintf_func) (info->stream, "exreg0");
735 comma = 1;
736 }
737 if (value & 0x02)
738 {
739 if (comma)
740 (*info->fprintf_func) (info->stream, ",");
741 (*info->fprintf_func) (info->stream, "exreg1");
742 comma = 1;
743 }
744 if (value & 0x01)
745 {
746 if (comma)
747 (*info->fprintf_func) (info->stream, ",");
748 (*info->fprintf_func) (info->stream, "exother");
749 comma = 1;
750 }
751 (*info->fprintf_func) (info->stream, "]");
752 }
753
754 else
755 (*info->fprintf_func) (info->stream, "%ld", (long) value);
756 }
757 /* All done. */
758 break;
759 }
760 op++;
761 }
762
763 if (!match)
764 {
765 /* xgettext:c-format */
766 (*info->fprintf_func) (info->stream, _("unknown\t0x%04x"), insn);
767 }
768 }
769