175fd0b74Schristos /* Disassemble AVR instructions.
2*e992f068Schristos Copyright (C) 1999-2022 Free Software Foundation, Inc.
375fd0b74Schristos
475fd0b74Schristos Contributed by Denis Chertykov <denisc@overta.ru>
575fd0b74Schristos
675fd0b74Schristos This file is part of libopcodes.
775fd0b74Schristos
875fd0b74Schristos This library is free software; you can redistribute it and/or modify
975fd0b74Schristos it under the terms of the GNU General Public License as published by
1075fd0b74Schristos the Free Software Foundation; either version 3, or (at your option)
1175fd0b74Schristos any later version.
1275fd0b74Schristos
1375fd0b74Schristos It is distributed in the hope that it will be useful, but WITHOUT
1475fd0b74Schristos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1575fd0b74Schristos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
1675fd0b74Schristos License for more details.
1775fd0b74Schristos
1875fd0b74Schristos You should have received a copy of the GNU General Public License
1975fd0b74Schristos along with this program; if not, write to the Free Software
2075fd0b74Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2175fd0b74Schristos MA 02110-1301, USA. */
2275fd0b74Schristos
2375fd0b74Schristos #include "sysdep.h"
2475fd0b74Schristos #include <assert.h>
25ede78133Schristos #include "disassemble.h"
2675fd0b74Schristos #include "opintl.h"
2775fd0b74Schristos #include "libiberty.h"
28*e992f068Schristos #include <stdint.h>
2975fd0b74Schristos
3075fd0b74Schristos struct avr_opcodes_s
3175fd0b74Schristos {
3275fd0b74Schristos char *name;
3375fd0b74Schristos char *constraints;
3475fd0b74Schristos char *opcode;
3575fd0b74Schristos int insn_size; /* In words. */
3675fd0b74Schristos int isa;
3775fd0b74Schristos unsigned int bin_opcode;
3875fd0b74Schristos };
3975fd0b74Schristos
4075fd0b74Schristos #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
4175fd0b74Schristos {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
4275fd0b74Schristos
4375fd0b74Schristos const struct avr_opcodes_s avr_opcodes[] =
4475fd0b74Schristos {
4575fd0b74Schristos #include "opcode/avr.h"
4675fd0b74Schristos {NULL, NULL, NULL, 0, 0, 0}
4775fd0b74Schristos };
4875fd0b74Schristos
4975fd0b74Schristos static const char * comment_start = "0x";
5075fd0b74Schristos
5175fd0b74Schristos static int
avr_operand(unsigned int insn,unsigned int insn2,unsigned int pc,int constraint,char * opcode_str,char * buf,char * comment,enum disassembler_style * style,int regs,int * sym,bfd_vma * sym_addr,disassemble_info * info)52*e992f068Schristos avr_operand (unsigned int insn,
53*e992f068Schristos unsigned int insn2,
54*e992f068Schristos unsigned int pc,
55*e992f068Schristos int constraint,
56*e992f068Schristos char * opcode_str,
57*e992f068Schristos char * buf,
58*e992f068Schristos char * comment,
59*e992f068Schristos enum disassembler_style * style,
60*e992f068Schristos int regs,
61*e992f068Schristos int * sym,
62*e992f068Schristos bfd_vma * sym_addr,
63*e992f068Schristos disassemble_info * info)
6475fd0b74Schristos {
6575fd0b74Schristos int ok = 1;
6675fd0b74Schristos *sym = 0;
6775fd0b74Schristos
6875fd0b74Schristos switch (constraint)
6975fd0b74Schristos {
7075fd0b74Schristos /* Any register operand. */
7175fd0b74Schristos case 'r':
7275fd0b74Schristos if (regs)
7375fd0b74Schristos insn = (insn & 0xf) | ((insn & 0x0200) >> 5); /* Source register. */
7475fd0b74Schristos else
7575fd0b74Schristos insn = (insn & 0x01f0) >> 4; /* Destination register. */
7675fd0b74Schristos
7775fd0b74Schristos sprintf (buf, "r%d", insn);
78*e992f068Schristos *style = dis_style_register;
7975fd0b74Schristos break;
8075fd0b74Schristos
8175fd0b74Schristos case 'd':
8275fd0b74Schristos if (regs)
8375fd0b74Schristos sprintf (buf, "r%d", 16 + (insn & 0xf));
8475fd0b74Schristos else
8575fd0b74Schristos sprintf (buf, "r%d", 16 + ((insn & 0xf0) >> 4));
86*e992f068Schristos *style = dis_style_register;
8775fd0b74Schristos break;
8875fd0b74Schristos
8975fd0b74Schristos case 'w':
9075fd0b74Schristos sprintf (buf, "r%d", 24 + ((insn & 0x30) >> 3));
91*e992f068Schristos *style = dis_style_register;
9275fd0b74Schristos break;
9375fd0b74Schristos
9475fd0b74Schristos case 'a':
9575fd0b74Schristos if (regs)
9675fd0b74Schristos sprintf (buf, "r%d", 16 + (insn & 7));
9775fd0b74Schristos else
9875fd0b74Schristos sprintf (buf, "r%d", 16 + ((insn >> 4) & 7));
99*e992f068Schristos *style = dis_style_register;
10075fd0b74Schristos break;
10175fd0b74Schristos
10275fd0b74Schristos case 'v':
10375fd0b74Schristos if (regs)
10475fd0b74Schristos sprintf (buf, "r%d", (insn & 0xf) * 2);
10575fd0b74Schristos else
10675fd0b74Schristos sprintf (buf, "r%d", ((insn & 0xf0) >> 3));
107*e992f068Schristos *style = dis_style_register;
10875fd0b74Schristos break;
10975fd0b74Schristos
11075fd0b74Schristos case 'e':
11175fd0b74Schristos {
11275fd0b74Schristos char *xyz;
11375fd0b74Schristos
11475fd0b74Schristos switch (insn & 0x100f)
11575fd0b74Schristos {
11675fd0b74Schristos case 0x0000: xyz = "Z"; break;
11775fd0b74Schristos case 0x1001: xyz = "Z+"; break;
11875fd0b74Schristos case 0x1002: xyz = "-Z"; break;
11975fd0b74Schristos case 0x0008: xyz = "Y"; break;
12075fd0b74Schristos case 0x1009: xyz = "Y+"; break;
12175fd0b74Schristos case 0x100a: xyz = "-Y"; break;
12275fd0b74Schristos case 0x100c: xyz = "X"; break;
12375fd0b74Schristos case 0x100d: xyz = "X+"; break;
12475fd0b74Schristos case 0x100e: xyz = "-X"; break;
12575fd0b74Schristos default: xyz = "??"; ok = 0;
12675fd0b74Schristos }
12775fd0b74Schristos strcpy (buf, xyz);
12875fd0b74Schristos
12975fd0b74Schristos if (AVR_UNDEF_P (insn))
13075fd0b74Schristos sprintf (comment, _("undefined"));
13175fd0b74Schristos }
132*e992f068Schristos *style = dis_style_register;
13375fd0b74Schristos break;
13475fd0b74Schristos
13575fd0b74Schristos case 'z':
13675fd0b74Schristos *buf++ = 'Z';
13775fd0b74Schristos
13875fd0b74Schristos /* Check for post-increment. */
13975fd0b74Schristos char *s;
14075fd0b74Schristos for (s = opcode_str; *s; ++s)
14175fd0b74Schristos {
14275fd0b74Schristos if (*s == '+')
14375fd0b74Schristos {
14475fd0b74Schristos if (insn & (1 << (15 - (s - opcode_str))))
14575fd0b74Schristos *buf++ = '+';
14675fd0b74Schristos break;
14775fd0b74Schristos }
14875fd0b74Schristos }
14975fd0b74Schristos
15075fd0b74Schristos *buf = '\0';
15175fd0b74Schristos if (AVR_UNDEF_P (insn))
15275fd0b74Schristos sprintf (comment, _("undefined"));
153*e992f068Schristos *style = dis_style_register;
15475fd0b74Schristos break;
15575fd0b74Schristos
15675fd0b74Schristos case 'b':
15775fd0b74Schristos {
15875fd0b74Schristos unsigned int x;
15975fd0b74Schristos
16075fd0b74Schristos x = (insn & 7);
16175fd0b74Schristos x |= (insn >> 7) & (3 << 3);
16275fd0b74Schristos x |= (insn >> 8) & (1 << 5);
16375fd0b74Schristos
16475fd0b74Schristos if (insn & 0x8)
16575fd0b74Schristos *buf++ = 'Y';
16675fd0b74Schristos else
16775fd0b74Schristos *buf++ = 'Z';
16875fd0b74Schristos sprintf (buf, "+%d", x);
16975fd0b74Schristos sprintf (comment, "0x%02x", x);
170*e992f068Schristos *style = dis_style_register;
17175fd0b74Schristos }
17275fd0b74Schristos break;
17375fd0b74Schristos
17475fd0b74Schristos case 'h':
17575fd0b74Schristos *sym = 1;
17675fd0b74Schristos *sym_addr = ((((insn & 1) | ((insn & 0x1f0) >> 3)) << 16) | insn2) * 2;
17775fd0b74Schristos /* See PR binutils/2454. Ideally we would like to display the hex
17875fd0b74Schristos value of the address only once, but this would mean recoding
17975fd0b74Schristos objdump_print_address() which would affect many targets. */
18075fd0b74Schristos sprintf (buf, "%#lx", (unsigned long) *sym_addr);
18175fd0b74Schristos strcpy (comment, comment_start);
182*e992f068Schristos info->insn_info_valid = 1;
183*e992f068Schristos info->insn_type = dis_jsr;
184*e992f068Schristos info->target = *sym_addr;
185*e992f068Schristos *style = dis_style_address;
18675fd0b74Schristos break;
18775fd0b74Schristos
18875fd0b74Schristos case 'L':
18975fd0b74Schristos {
19075fd0b74Schristos int rel_addr = (((insn & 0xfff) ^ 0x800) - 0x800) * 2;
19175fd0b74Schristos sprintf (buf, ".%+-8d", rel_addr);
19275fd0b74Schristos *sym = 1;
19375fd0b74Schristos *sym_addr = pc + 2 + rel_addr;
19475fd0b74Schristos strcpy (comment, comment_start);
195*e992f068Schristos info->insn_info_valid = 1;
196*e992f068Schristos info->insn_type = dis_branch;
197*e992f068Schristos info->target = *sym_addr;
198*e992f068Schristos *style = dis_style_address_offset;
19975fd0b74Schristos }
20075fd0b74Schristos break;
20175fd0b74Schristos
20275fd0b74Schristos case 'l':
20375fd0b74Schristos {
20475fd0b74Schristos int rel_addr = ((((insn >> 3) & 0x7f) ^ 0x40) - 0x40) * 2;
20575fd0b74Schristos
20675fd0b74Schristos sprintf (buf, ".%+-8d", rel_addr);
20775fd0b74Schristos *sym = 1;
20875fd0b74Schristos *sym_addr = pc + 2 + rel_addr;
20975fd0b74Schristos strcpy (comment, comment_start);
210*e992f068Schristos info->insn_info_valid = 1;
211*e992f068Schristos info->insn_type = dis_condbranch;
212*e992f068Schristos info->target = *sym_addr;
213*e992f068Schristos *style = dis_style_address_offset;
21475fd0b74Schristos }
21575fd0b74Schristos break;
21675fd0b74Schristos
21775fd0b74Schristos case 'i':
21875fd0b74Schristos {
21975fd0b74Schristos unsigned int val = insn2 | 0x800000;
22075fd0b74Schristos *sym = 1;
22175fd0b74Schristos *sym_addr = val;
22275fd0b74Schristos sprintf (buf, "0x%04X", insn2);
22375fd0b74Schristos strcpy (comment, comment_start);
224*e992f068Schristos *style = dis_style_immediate;
22575fd0b74Schristos }
22675fd0b74Schristos break;
22775fd0b74Schristos
22875fd0b74Schristos case 'j':
22975fd0b74Schristos {
23075fd0b74Schristos unsigned int val = ((insn & 0xf) | ((insn & 0x600) >> 5)
23175fd0b74Schristos | ((insn & 0x100) >> 2));
232012573ebSchristos if ((insn & 0x100) == 0)
233012573ebSchristos val |= 0x80;
23475fd0b74Schristos *sym = 1;
23575fd0b74Schristos *sym_addr = val | 0x800000;
23675fd0b74Schristos sprintf (buf, "0x%02x", val);
23775fd0b74Schristos strcpy (comment, comment_start);
238*e992f068Schristos *style = dis_style_immediate;
23975fd0b74Schristos }
24075fd0b74Schristos break;
24175fd0b74Schristos
24275fd0b74Schristos case 'M':
24375fd0b74Schristos sprintf (buf, "0x%02X", ((insn & 0xf00) >> 4) | (insn & 0xf));
24475fd0b74Schristos sprintf (comment, "%d", ((insn & 0xf00) >> 4) | (insn & 0xf));
245*e992f068Schristos *style = dis_style_immediate;
24675fd0b74Schristos break;
24775fd0b74Schristos
24875fd0b74Schristos case 'n':
24975fd0b74Schristos sprintf (buf, "??");
250ede78133Schristos /* xgettext:c-format */
251ede78133Schristos opcodes_error_handler (_("internal disassembler error"));
25275fd0b74Schristos ok = 0;
253*e992f068Schristos *style = dis_style_immediate;
25475fd0b74Schristos break;
25575fd0b74Schristos
25675fd0b74Schristos case 'K':
25775fd0b74Schristos {
25875fd0b74Schristos unsigned int x;
25975fd0b74Schristos
26075fd0b74Schristos x = (insn & 0xf) | ((insn >> 2) & 0x30);
26175fd0b74Schristos sprintf (buf, "0x%02x", x);
26275fd0b74Schristos sprintf (comment, "%d", x);
263*e992f068Schristos *style = dis_style_immediate;
26475fd0b74Schristos }
26575fd0b74Schristos break;
26675fd0b74Schristos
26775fd0b74Schristos case 's':
26875fd0b74Schristos sprintf (buf, "%d", insn & 7);
269*e992f068Schristos *style = dis_style_immediate;
27075fd0b74Schristos break;
27175fd0b74Schristos
27275fd0b74Schristos case 'S':
27375fd0b74Schristos sprintf (buf, "%d", (insn >> 4) & 7);
274*e992f068Schristos *style = dis_style_immediate;
27575fd0b74Schristos break;
27675fd0b74Schristos
27775fd0b74Schristos case 'P':
27875fd0b74Schristos {
27975fd0b74Schristos unsigned int x;
28075fd0b74Schristos
28175fd0b74Schristos x = (insn & 0xf);
28275fd0b74Schristos x |= (insn >> 5) & 0x30;
28375fd0b74Schristos sprintf (buf, "0x%02x", x);
28475fd0b74Schristos sprintf (comment, "%d", x);
285*e992f068Schristos *style = dis_style_address;
28675fd0b74Schristos }
28775fd0b74Schristos break;
28875fd0b74Schristos
28975fd0b74Schristos case 'p':
29075fd0b74Schristos {
29175fd0b74Schristos unsigned int x;
29275fd0b74Schristos
29375fd0b74Schristos x = (insn >> 3) & 0x1f;
29475fd0b74Schristos sprintf (buf, "0x%02x", x);
29575fd0b74Schristos sprintf (comment, "%d", x);
296*e992f068Schristos *style = dis_style_address;
29775fd0b74Schristos }
29875fd0b74Schristos break;
29975fd0b74Schristos
30075fd0b74Schristos case 'E':
30175fd0b74Schristos sprintf (buf, "%d", (insn >> 4) & 15);
302*e992f068Schristos *style = dis_style_immediate;
30375fd0b74Schristos break;
30475fd0b74Schristos
30575fd0b74Schristos case '?':
30675fd0b74Schristos *buf = '\0';
30775fd0b74Schristos break;
30875fd0b74Schristos
30975fd0b74Schristos default:
31075fd0b74Schristos sprintf (buf, "??");
311ede78133Schristos /* xgettext:c-format */
312ede78133Schristos opcodes_error_handler (_("unknown constraint `%c'"), constraint);
31375fd0b74Schristos ok = 0;
31475fd0b74Schristos }
31575fd0b74Schristos
31675fd0b74Schristos return ok;
31775fd0b74Schristos }
31875fd0b74Schristos
319ede78133Schristos /* Read the opcode from ADDR. Return 0 in success and save opcode
320ede78133Schristos in *INSN, otherwise, return -1. */
321ede78133Schristos
322ede78133Schristos static int
avrdis_opcode(bfd_vma addr,disassemble_info * info,uint16_t * insn)323ede78133Schristos avrdis_opcode (bfd_vma addr, disassemble_info *info, uint16_t *insn)
32475fd0b74Schristos {
32575fd0b74Schristos bfd_byte buffer[2];
32675fd0b74Schristos int status;
32775fd0b74Schristos
32875fd0b74Schristos status = info->read_memory_func (addr, buffer, 2, info);
32975fd0b74Schristos
33075fd0b74Schristos if (status == 0)
331ede78133Schristos {
332ede78133Schristos *insn = bfd_getl16 (buffer);
333ede78133Schristos return 0;
334ede78133Schristos }
33575fd0b74Schristos
33675fd0b74Schristos info->memory_error_func (status, addr, info);
33775fd0b74Schristos return -1;
33875fd0b74Schristos }
33975fd0b74Schristos
34075fd0b74Schristos
34175fd0b74Schristos int
print_insn_avr(bfd_vma addr,disassemble_info * info)34275fd0b74Schristos print_insn_avr (bfd_vma addr, disassemble_info *info)
34375fd0b74Schristos {
344ede78133Schristos uint16_t insn, insn2;
34575fd0b74Schristos const struct avr_opcodes_s *opcode;
34675fd0b74Schristos static unsigned int *maskptr;
34775fd0b74Schristos void *stream = info->stream;
348*e992f068Schristos fprintf_styled_ftype prin = info->fprintf_styled_func;
34975fd0b74Schristos static unsigned int *avr_bin_masks;
35075fd0b74Schristos static int initialized;
35175fd0b74Schristos int cmd_len = 2;
35275fd0b74Schristos int ok = 0;
35375fd0b74Schristos char op1[20], op2[20], comment1[40], comment2[40];
354*e992f068Schristos enum disassembler_style style_op1, style_op2;
35575fd0b74Schristos int sym_op1 = 0, sym_op2 = 0;
35675fd0b74Schristos bfd_vma sym_addr1, sym_addr2;
35775fd0b74Schristos
358*e992f068Schristos /* Clear instruction information field. */
359*e992f068Schristos info->insn_info_valid = 0;
360*e992f068Schristos info->branch_delay_insns = 0;
361*e992f068Schristos info->data_size = 0;
362*e992f068Schristos info->insn_type = dis_noninsn;
363*e992f068Schristos info->target = 0;
364*e992f068Schristos info->target2 = 0;
36575fd0b74Schristos
36675fd0b74Schristos if (!initialized)
36775fd0b74Schristos {
36875fd0b74Schristos unsigned int nopcodes;
36975fd0b74Schristos
37075fd0b74Schristos /* PR 4045: Try to avoid duplicating the 0x prefix that
37175fd0b74Schristos objdump_print_addr() will put on addresses when there
37275fd0b74Schristos is no symbol table available. */
37375fd0b74Schristos if (info->symtab_size == 0)
37475fd0b74Schristos comment_start = " ";
37575fd0b74Schristos
37675fd0b74Schristos nopcodes = sizeof (avr_opcodes) / sizeof (struct avr_opcodes_s);
37775fd0b74Schristos
37875fd0b74Schristos avr_bin_masks = xmalloc (nopcodes * sizeof (unsigned int));
37975fd0b74Schristos
38075fd0b74Schristos for (opcode = avr_opcodes, maskptr = avr_bin_masks;
38175fd0b74Schristos opcode->name;
38275fd0b74Schristos opcode++, maskptr++)
38375fd0b74Schristos {
38475fd0b74Schristos char * s;
38575fd0b74Schristos unsigned int bin = 0;
38675fd0b74Schristos unsigned int mask = 0;
38775fd0b74Schristos
38875fd0b74Schristos for (s = opcode->opcode; *s; ++s)
38975fd0b74Schristos {
39075fd0b74Schristos bin <<= 1;
39175fd0b74Schristos mask <<= 1;
39275fd0b74Schristos bin |= (*s == '1');
39375fd0b74Schristos mask |= (*s == '1' || *s == '0');
39475fd0b74Schristos }
39575fd0b74Schristos assert (s - opcode->opcode == 16);
39675fd0b74Schristos assert (opcode->bin_opcode == bin);
39775fd0b74Schristos *maskptr = mask;
39875fd0b74Schristos }
39975fd0b74Schristos
40075fd0b74Schristos initialized = 1;
40175fd0b74Schristos }
40275fd0b74Schristos
403ede78133Schristos if (avrdis_opcode (addr, info, &insn) != 0)
404ede78133Schristos return -1;
40575fd0b74Schristos
40675fd0b74Schristos for (opcode = avr_opcodes, maskptr = avr_bin_masks;
40775fd0b74Schristos opcode->name;
40875fd0b74Schristos opcode++, maskptr++)
40975fd0b74Schristos {
41075fd0b74Schristos if ((opcode->isa == AVR_ISA_TINY) && (info->mach != bfd_mach_avrtiny))
41175fd0b74Schristos continue;
41275fd0b74Schristos if ((insn & *maskptr) == opcode->bin_opcode)
41375fd0b74Schristos break;
41475fd0b74Schristos }
41575fd0b74Schristos
41675fd0b74Schristos /* Special case: disassemble `ldd r,b+0' as `ld r,b', and
41775fd0b74Schristos `std b+0,r' as `st b,r' (next entry in the table). */
41875fd0b74Schristos
41975fd0b74Schristos if (AVR_DISP0_P (insn))
42075fd0b74Schristos opcode++;
42175fd0b74Schristos
42275fd0b74Schristos op1[0] = 0;
42375fd0b74Schristos op2[0] = 0;
42475fd0b74Schristos comment1[0] = 0;
42575fd0b74Schristos comment2[0] = 0;
426*e992f068Schristos style_op1 = dis_style_text;
427*e992f068Schristos style_op2 = dis_style_text;
42875fd0b74Schristos
42975fd0b74Schristos if (opcode->name)
43075fd0b74Schristos {
43175fd0b74Schristos char *constraints = opcode->constraints;
43275fd0b74Schristos char *opcode_str = opcode->opcode;
43375fd0b74Schristos
43475fd0b74Schristos insn2 = 0;
43575fd0b74Schristos ok = 1;
43675fd0b74Schristos
43775fd0b74Schristos if (opcode->insn_size > 1)
43875fd0b74Schristos {
439ede78133Schristos if (avrdis_opcode (addr + 2, info, &insn2) != 0)
440ede78133Schristos return -1;
44175fd0b74Schristos cmd_len = 4;
44275fd0b74Schristos }
44375fd0b74Schristos
44475fd0b74Schristos if (*constraints && *constraints != '?')
44575fd0b74Schristos {
44675fd0b74Schristos int regs = REGISTER_P (*constraints);
44775fd0b74Schristos
448*e992f068Schristos ok = avr_operand (insn, insn2, addr, *constraints, opcode_str, op1,
449*e992f068Schristos comment1, &style_op1, 0, &sym_op1, &sym_addr1,
450*e992f068Schristos info);
45175fd0b74Schristos
45275fd0b74Schristos if (ok && *(++constraints) == ',')
453*e992f068Schristos ok = avr_operand (insn, insn2, addr, *(++constraints), opcode_str,
454*e992f068Schristos op2, *comment1 ? comment2 : comment1,
455*e992f068Schristos &style_op2, regs, &sym_op2, &sym_addr2,
456*e992f068Schristos info);
45775fd0b74Schristos }
45875fd0b74Schristos }
45975fd0b74Schristos
46075fd0b74Schristos if (!ok)
46175fd0b74Schristos {
46275fd0b74Schristos /* Unknown opcode, or invalid combination of operands. */
46375fd0b74Schristos sprintf (op1, "0x%04x", insn);
46475fd0b74Schristos op2[0] = 0;
46575fd0b74Schristos sprintf (comment1, "????");
46675fd0b74Schristos comment2[0] = 0;
46775fd0b74Schristos }
46875fd0b74Schristos
469*e992f068Schristos (*prin) (stream, ok ? dis_style_mnemonic : dis_style_assembler_directive,
470*e992f068Schristos "%s", ok ? opcode->name : ".word");
47175fd0b74Schristos
47275fd0b74Schristos if (*op1)
473*e992f068Schristos (*prin) (stream, style_op1, "\t%s", op1);
47475fd0b74Schristos
47575fd0b74Schristos if (*op2)
476*e992f068Schristos {
477*e992f068Schristos (*prin) (stream, dis_style_text, ", ");
478*e992f068Schristos (*prin) (stream, style_op2, "%s", op2);
479*e992f068Schristos }
48075fd0b74Schristos
48175fd0b74Schristos if (*comment1)
482*e992f068Schristos (*prin) (stream, dis_style_comment_start, "\t; %s", comment1);
48375fd0b74Schristos
48475fd0b74Schristos if (sym_op1)
48575fd0b74Schristos info->print_address_func (sym_addr1, info);
48675fd0b74Schristos
48775fd0b74Schristos if (*comment2)
488*e992f068Schristos (*prin) (stream, dis_style_comment_start, " %s", comment2);
48975fd0b74Schristos
49075fd0b74Schristos if (sym_op2)
49175fd0b74Schristos info->print_address_func (sym_addr2, info);
49275fd0b74Schristos
49375fd0b74Schristos return cmd_len;
49475fd0b74Schristos }
495