1 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 Copyright (c) 1989, 91-97, 1998 Free Software Foundation, Inc.
3 Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
5 This file is part of GDB, GAS, and the GNU binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 #include "opcode/mips.h"
27 /* FIXME: These are needed to figure out if the code is mips16 or
28 not. The low bit of the address is often a good indicator. No
29 symbol table is available when this code runs out in an embedded
30 system as when it is used for disassembler support in a monitor. */
32 #if !defined(EMBEDDED_ENV)
33 #define SYMTAB_AVAILABLE 1
38 static int print_insn_mips16
PARAMS ((bfd_vma
, struct disassemble_info
*));
39 static void print_mips16_insn_arg
40 PARAMS ((int, const struct mips_opcode
*, int, boolean
, int, bfd_vma
,
41 struct disassemble_info
*));
43 /* Mips instructions are never longer than this many bytes. */
46 static void print_insn_arg
PARAMS ((const char *, unsigned long, bfd_vma
,
47 struct disassemble_info
*));
48 static int _print_insn_mips
PARAMS ((bfd_vma
, unsigned long int,
49 struct disassemble_info
*));
52 /* FIXME: This should be shared with gdb somehow. */
53 #define REGISTER_NAMES \
54 { "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", \
55 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", \
56 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \
57 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", \
58 "sr", "lo", "hi", "bad", "cause","pc", \
59 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
60 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
61 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",\
62 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",\
63 "fsr", "fir", "fp", "inx", "rand", "tlblo","ctxt", "tlbhi",\
67 static CONST
char * CONST reg_names
[] = REGISTER_NAMES
;
69 /* The mips16 register names. */
70 static const char * const mips16_reg_names
[] =
72 "s0", "s1", "v0", "v1", "a0", "a1", "a2", "a3"
77 print_insn_arg (d
, l
, pc
, info
)
79 register unsigned long int l
;
81 struct disassemble_info
*info
;
90 (*info
->fprintf_func
) (info
->stream
, "%c", *d
);
97 (*info
->fprintf_func
) (info
->stream
, "$%s",
98 reg_names
[(l
>> OP_SH_RS
) & OP_MASK_RS
]);
103 (*info
->fprintf_func
) (info
->stream
, "$%s",
104 reg_names
[(l
>> OP_SH_RT
) & OP_MASK_RT
]);
109 (*info
->fprintf_func
) (info
->stream
, "0x%x",
110 (l
>> OP_SH_IMMEDIATE
) & OP_MASK_IMMEDIATE
);
113 case 'j': /* same as i, but sign-extended */
115 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
118 (*info
->fprintf_func
) (info
->stream
, "%d",
123 (*info
->fprintf_func
) (info
->stream
, "0x%x",
124 (unsigned int) ((l
>> OP_SH_PREFX
)
129 (*info
->fprintf_func
) (info
->stream
, "0x%x",
130 (unsigned int) ((l
>> OP_SH_CACHE
)
135 (*info
->print_address_func
)
136 (((pc
& 0xF0000000) | (((l
>> OP_SH_TARGET
) & OP_MASK_TARGET
) << 2)),
141 /* sign extend the displacement */
142 delta
= (l
>> OP_SH_DELTA
) & OP_MASK_DELTA
;
145 (*info
->print_address_func
)
146 ((delta
<< 2) + pc
+ 4,
151 (*info
->fprintf_func
) (info
->stream
, "$%s",
152 reg_names
[(l
>> OP_SH_RD
) & OP_MASK_RD
]);
156 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
160 (*info
->fprintf_func
) (info
->stream
, "0x%x",
161 (l
>> OP_SH_SHAMT
) & OP_MASK_SHAMT
);
165 (*info
->fprintf_func
) (info
->stream
, "0x%x",
166 (l
>> OP_SH_CODE
) & OP_MASK_CODE
);
171 (*info
->fprintf_func
) (info
->stream
, "0x%x",
172 (l
>> OP_SH_CODE2
) & OP_MASK_CODE2
);
176 (*info
->fprintf_func
) (info
->stream
, "0x%x",
177 (l
>> OP_SH_COPZ
) & OP_MASK_COPZ
);
181 (*info
->fprintf_func
) (info
->stream
, "0x%x",
182 (l
>> OP_SH_SYSCALL
) & OP_MASK_SYSCALL
);
187 (*info
->fprintf_func
) (info
->stream
, "$f%d",
188 (l
>> OP_SH_FS
) & OP_MASK_FS
);
194 (*info
->fprintf_func
) (info
->stream
, "$f%d",
195 (l
>> OP_SH_FT
) & OP_MASK_FT
);
199 (*info
->fprintf_func
) (info
->stream
, "$f%d",
200 (l
>> OP_SH_FD
) & OP_MASK_FD
);
204 (*info
->fprintf_func
) (info
->stream
, "$f%d",
205 (l
>> OP_SH_FR
) & OP_MASK_FR
);
209 (*info
->fprintf_func
) (info
->stream
, "$%d",
210 (l
>> OP_SH_RT
) & OP_MASK_RT
);
214 (*info
->fprintf_func
) (info
->stream
, "$%d",
215 (l
>> OP_SH_RD
) & OP_MASK_RD
);
219 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
220 (l
>> OP_SH_BCC
) & OP_MASK_BCC
);
224 (*info
->fprintf_func
) (info
->stream
, "$fcc%d",
225 (l
>> OP_SH_CCC
) & OP_MASK_CCC
);
229 (*info
->fprintf_func
) (info
->stream
, "%d",
230 (l
>> OP_SH_PERFREG
) & OP_MASK_PERFREG
);
235 /* xgettext:c-format */
236 (*info
->fprintf_func
) (info
->stream
,
237 _("# internal error, undefined modifier(%c)"),
245 /* Figure out the MIPS ISA and CPU based on the machine number.
246 FIXME: What does this have to do with SYMTAB_AVAILABLE? */
249 set_mips_isa_type (mach
, isa
, cputype
)
254 int target_processor
= 0;
259 case bfd_mach_mips3000
:
260 target_processor
= 3000;
263 case bfd_mach_mips3900
:
264 target_processor
= 3900;
267 case bfd_mach_mips4000
:
268 target_processor
= 4000;
271 case bfd_mach_mips4010
:
272 target_processor
= 4010;
275 case bfd_mach_mips4100
:
276 target_processor
= 4100;
279 case bfd_mach_mips4111
:
280 target_processor
= 4100;
283 case bfd_mach_mips4300
:
284 target_processor
= 4300;
287 case bfd_mach_mips4400
:
288 target_processor
= 4400;
291 case bfd_mach_mips4600
:
292 target_processor
= 4600;
295 case bfd_mach_mips4650
:
296 target_processor
= 4650;
299 case bfd_mach_mips5000
:
300 target_processor
= 5000;
303 case bfd_mach_mips6000
:
304 target_processor
= 6000;
307 case bfd_mach_mips8000
:
308 target_processor
= 8000;
311 case bfd_mach_mips10000
:
312 target_processor
= 10000;
315 case bfd_mach_mips16
:
316 target_processor
= 16;
320 target_processor
= 3000;
327 *cputype
= target_processor
;
330 #endif /* SYMTAB_AVAILABLE */
332 /* Print the mips instruction at address MEMADDR in debugged memory,
333 on using INFO. Returns length of the instruction, in bytes, which is
334 always 4. BIGENDIAN must be 1 if this is big-endian code, 0 if
335 this is little-endian code. */
338 _print_insn_mips (memaddr
, word
, info
)
340 unsigned long int word
;
341 struct disassemble_info
*info
;
343 register const struct mips_opcode
*op
;
344 int target_processor
, mips_isa
;
345 static boolean init
= 0;
346 static const struct mips_opcode
*mips_hash
[OP_MASK_OP
+ 1];
348 /* Build a hash table to shorten the search time. */
353 for (i
= 0; i
<= OP_MASK_OP
; i
++)
355 for (op
= mips_opcodes
; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
357 if (op
->pinfo
== INSN_MACRO
)
359 if (i
== ((op
->match
>> OP_SH_OP
) & OP_MASK_OP
))
370 #if ! SYMTAB_AVAILABLE
371 /* This is running out on a target machine, not in a host tool.
372 FIXME: Where does mips_target_info come from? */
373 target_processor
= mips_target_info
.processor
;
374 mips_isa
= mips_target_info
.isa
;
376 set_mips_isa_type (info
->mach
, &mips_isa
, &target_processor
);
379 info
->bytes_per_chunk
= 4;
380 info
->display_endian
= info
->endian
;
382 op
= mips_hash
[(word
>> OP_SH_OP
) & OP_MASK_OP
];
385 for (; op
< &mips_opcodes
[NUMOPCODES
]; op
++)
387 if (op
->pinfo
!= INSN_MACRO
&& (word
& op
->mask
) == op
->match
)
389 register const char *d
;
391 if (! OPCODE_IS_MEMBER (op
, mips_isa
, target_processor
))
394 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
397 if (d
!= NULL
&& *d
!= '\0')
399 (*info
->fprintf_func
) (info
->stream
, "\t");
400 for (; *d
!= '\0'; d
++)
401 print_insn_arg (d
, word
, memaddr
, info
);
409 /* Handle undefined instructions. */
410 (*info
->fprintf_func
) (info
->stream
, "0x%x", word
);
415 /* In an environment where we do not know the symbol type of the
416 instruction we are forced to assume that the low order bit of the
417 instructions' address may mark it as a mips16 instruction. If we
418 are single stepping, or the pc is within the disassembled function,
419 this works. Otherwise, we need a clue. Sometimes. */
422 print_insn_big_mips (memaddr
, info
)
424 struct disassemble_info
*info
;
430 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */
431 /* Only a few tools will work this way. */
433 return print_insn_mips16 (memaddr
, info
);
438 || (info
->flavour
== bfd_target_elf_flavour
439 && info
->symbols
!= NULL
440 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
442 return print_insn_mips16 (memaddr
, info
);
445 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
447 return _print_insn_mips (memaddr
, (unsigned long) bfd_getb32 (buffer
),
451 (*info
->memory_error_func
) (status
, memaddr
, info
);
457 print_insn_little_mips (memaddr
, info
)
459 struct disassemble_info
*info
;
467 return print_insn_mips16 (memaddr
, info
);
472 || (info
->flavour
== bfd_target_elf_flavour
473 && info
->symbols
!= NULL
474 && ((*(elf_symbol_type
**) info
->symbols
)->internal_elf_sym
.st_other
476 return print_insn_mips16 (memaddr
, info
);
479 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 4, info
);
481 return _print_insn_mips (memaddr
, (unsigned long) bfd_getl32 (buffer
),
485 (*info
->memory_error_func
) (status
, memaddr
, info
);
490 /* Disassemble mips16 instructions. */
493 print_insn_mips16 (memaddr
, info
)
495 struct disassemble_info
*info
;
503 const struct mips_opcode
*op
, *opend
;
505 info
->bytes_per_chunk
= 2;
506 info
->display_endian
= info
->endian
;
508 info
->insn_info_valid
= 1;
509 info
->branch_delay_insns
= 0;
511 info
->insn_type
= dis_nonbranch
;
515 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
518 (*info
->memory_error_func
) (status
, memaddr
, info
);
524 if (info
->endian
== BFD_ENDIAN_BIG
)
525 insn
= bfd_getb16 (buffer
);
527 insn
= bfd_getl16 (buffer
);
529 /* Handle the extend opcode specially. */
531 if ((insn
& 0xf800) == 0xf000)
534 extend
= insn
& 0x7ff;
538 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2, info
);
541 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
542 (unsigned int) extend
);
543 (*info
->memory_error_func
) (status
, memaddr
, info
);
547 if (info
->endian
== BFD_ENDIAN_BIG
)
548 insn
= bfd_getb16 (buffer
);
550 insn
= bfd_getl16 (buffer
);
552 /* Check for an extend opcode followed by an extend opcode. */
553 if ((insn
& 0xf800) == 0xf000)
555 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
556 (unsigned int) extend
);
557 info
->insn_type
= dis_noninsn
;
564 /* FIXME: Should probably use a hash table on the major opcode here. */
566 opend
= mips16_opcodes
+ bfd_mips16_num_opcodes
;
567 for (op
= mips16_opcodes
; op
< opend
; op
++)
569 if (op
->pinfo
!= INSN_MACRO
&& (insn
& op
->mask
) == op
->match
)
573 if (strchr (op
->args
, 'a') != NULL
)
577 (*info
->fprintf_func
) (info
->stream
, "extend 0x%x",
578 (unsigned int) extend
);
579 info
->insn_type
= dis_noninsn
;
587 status
= (*info
->read_memory_func
) (memaddr
, buffer
, 2,
592 if (info
->endian
== BFD_ENDIAN_BIG
)
593 extend
= bfd_getb16 (buffer
);
595 extend
= bfd_getl16 (buffer
);
600 (*info
->fprintf_func
) (info
->stream
, "%s", op
->name
);
601 if (op
->args
[0] != '\0')
602 (*info
->fprintf_func
) (info
->stream
, "\t");
604 for (s
= op
->args
; *s
!= '\0'; s
++)
608 && (((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)
609 == ((insn
>> MIPS16OP_SH_RY
) & MIPS16OP_MASK_RY
)))
611 /* Skip the register and the comma. */
617 && (((insn
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
)
618 == ((insn
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
)))
620 /* Skip the register and the comma. */
624 print_mips16_insn_arg (*s
, op
, insn
, use_extend
, extend
, memaddr
,
628 if ((op
->pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
630 info
->branch_delay_insns
= 1;
631 if (info
->insn_type
!= dis_jsr
)
632 info
->insn_type
= dis_branch
;
640 (*info
->fprintf_func
) (info
->stream
, "0x%x", extend
| 0xf000);
641 (*info
->fprintf_func
) (info
->stream
, "0x%x", insn
);
642 info
->insn_type
= dis_noninsn
;
647 /* Disassemble an operand for a mips16 instruction. */
650 print_mips16_insn_arg (type
, op
, l
, use_extend
, extend
, memaddr
, info
)
652 const struct mips_opcode
*op
;
657 struct disassemble_info
*info
;
664 (*info
->fprintf_func
) (info
->stream
, "%c", type
);
669 (*info
->fprintf_func
) (info
->stream
, "$%s",
670 mips16_reg_names
[((l
>> MIPS16OP_SH_RY
)
671 & MIPS16OP_MASK_RY
)]);
676 (*info
->fprintf_func
) (info
->stream
, "$%s",
677 mips16_reg_names
[((l
>> MIPS16OP_SH_RX
)
678 & MIPS16OP_MASK_RX
)]);
682 (*info
->fprintf_func
) (info
->stream
, "$%s",
683 mips16_reg_names
[((l
>> MIPS16OP_SH_RZ
)
684 & MIPS16OP_MASK_RZ
)]);
688 (*info
->fprintf_func
) (info
->stream
, "$%s",
689 mips16_reg_names
[((l
>> MIPS16OP_SH_MOVE32Z
)
690 & MIPS16OP_MASK_MOVE32Z
)]);
694 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[0]);
698 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[29]);
702 (*info
->fprintf_func
) (info
->stream
, "$pc");
706 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[31]);
710 (*info
->fprintf_func
) (info
->stream
, "$%s",
711 reg_names
[((l
>> MIPS16OP_SH_REGR32
)
712 & MIPS16OP_MASK_REGR32
)]);
716 (*info
->fprintf_func
) (info
->stream
, "$%s",
717 reg_names
[MIPS16OP_EXTRACT_REG32R (l
)]);
743 int immed
, nbits
, shift
, signedp
, extbits
, pcrel
, extu
, branch
;
755 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
761 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
767 immed
= (l
>> MIPS16OP_SH_RZ
) & MIPS16OP_MASK_RZ
;
773 immed
= (l
>> MIPS16OP_SH_RX
) & MIPS16OP_MASK_RX
;
779 immed
= (l
>> MIPS16OP_SH_IMM4
) & MIPS16OP_MASK_IMM4
;
785 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
786 info
->insn_type
= dis_dref
;
792 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
793 info
->insn_type
= dis_dref
;
799 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
800 if ((op
->pinfo
& MIPS16_INSN_READ_PC
) == 0
801 && (op
->pinfo
& MIPS16_INSN_READ_SP
) == 0)
803 info
->insn_type
= dis_dref
;
810 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
811 info
->insn_type
= dis_dref
;
816 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
821 immed
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
825 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
830 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
831 /* FIXME: This might be lw, or it might be addiu to $sp or
832 $pc. We assume it's load. */
833 info
->insn_type
= dis_dref
;
839 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
840 info
->insn_type
= dis_dref
;
845 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
850 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
856 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
861 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
865 info
->insn_type
= dis_condbranch
;
869 immed
= (l
>> MIPS16OP_SH_IMM11
) & MIPS16OP_MASK_IMM11
;
873 info
->insn_type
= dis_branch
;
878 immed
= (l
>> MIPS16OP_SH_IMM8
) & MIPS16OP_MASK_IMM8
;
880 /* FIXME: This can be lw or la. We assume it is lw. */
881 info
->insn_type
= dis_dref
;
887 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
889 info
->insn_type
= dis_dref
;
895 immed
= (l
>> MIPS16OP_SH_IMM5
) & MIPS16OP_MASK_IMM5
;
904 if (signedp
&& immed
>= (1 << (nbits
- 1)))
907 if ((type
== '<' || type
== '>' || type
== '[' || type
== ']')
914 immed
|= ((extend
& 0x1f) << 11) | (extend
& 0x7e0);
915 else if (extbits
== 15)
916 immed
|= ((extend
& 0xf) << 11) | (extend
& 0x7f0);
918 immed
= ((extend
>> 6) & 0x1f) | (extend
& 0x20);
919 immed
&= (1 << extbits
) - 1;
920 if (! extu
&& immed
>= (1 << (extbits
- 1)))
921 immed
-= 1 << extbits
;
925 (*info
->fprintf_func
) (info
->stream
, "%d", immed
);
934 baseaddr
= memaddr
+ 2;
937 baseaddr
= memaddr
- 2;
945 /* If this instruction is in the delay slot of a jr
946 instruction, the base address is the address of the
947 jr instruction. If it is in the delay slot of jalr
948 instruction, the base address is the address of the
949 jalr instruction. This test is unreliable: we have
950 no way of knowing whether the previous word is
951 instruction or data. */
952 status
= (*info
->read_memory_func
) (memaddr
- 4, buffer
, 2,
955 && (((info
->endian
== BFD_ENDIAN_BIG
956 ? bfd_getb16 (buffer
)
957 : bfd_getl16 (buffer
))
958 & 0xf800) == 0x1800))
959 baseaddr
= memaddr
- 4;
962 status
= (*info
->read_memory_func
) (memaddr
- 2, buffer
,
965 && (((info
->endian
== BFD_ENDIAN_BIG
966 ? bfd_getb16 (buffer
)
967 : bfd_getl16 (buffer
))
968 & 0xf81f) == 0xe800))
969 baseaddr
= memaddr
- 2;
972 val
= (baseaddr
& ~ ((1 << shift
) - 1)) + immed
;
973 (*info
->print_address_func
) (val
, info
);
982 l
= ((l
& 0x1f) << 23) | ((l
& 0x3e0) << 13) | (extend
<< 2);
983 (*info
->print_address_func
) ((memaddr
& 0xf0000000) | l
, info
);
984 info
->insn_type
= dis_jsr
;
985 info
->target
= (memaddr
& 0xf0000000) | l
;
986 info
->branch_delay_insns
= 1;
992 int need_comma
, amask
, smask
;
996 l
= (l
>> MIPS16OP_SH_IMM6
) & MIPS16OP_MASK_IMM6
;
998 amask
= (l
>> 3) & 7;
1000 if (amask
> 0 && amask
< 5)
1002 (*info
->fprintf_func
) (info
->stream
, "$%s", reg_names
[4]);
1004 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1005 reg_names
[amask
+ 3]);
1009 smask
= (l
>> 1) & 3;
1012 (*info
->fprintf_func
) (info
->stream
, "%s??",
1013 need_comma
? "," : "");
1018 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1019 need_comma
? "," : "",
1022 (*info
->fprintf_func
) (info
->stream
, "-$%s",
1023 reg_names
[smask
+ 15]);
1029 (*info
->fprintf_func
) (info
->stream
, "%s$%s",
1030 need_comma
? "," : "",
1035 if (amask
== 5 || amask
== 6)
1037 (*info
->fprintf_func
) (info
->stream
, "%s$f0",
1038 need_comma
? "," : "");
1040 (*info
->fprintf_func
) (info
->stream
, "-$f1");