1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
24 #include "safe-ctype.h"
26 #include "opcode/d10v.h"
28 #include "dwarf2dbg.h"
30 const char comment_chars
[] = ";";
31 const char line_comment_chars
[] = "#";
32 const char line_separator_chars
[] = "";
33 const char *md_shortopts
= "O";
34 const char EXP_CHARS
[] = "eE";
35 const char FLT_CHARS
[] = "dD";
39 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \
40 && (X)->X_op_symbol != NULL \
41 && symbol_constant_p ((X)->X_op_symbol) \
42 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
43 #define AT_WORD_RIGHT_SHIFT 2
46 #define MAX_INSN_FIXUPS 5
54 bfd_reloc_code_real_type reloc
;
57 typedef struct _fixups
60 struct d10v_fixup fix
[MAX_INSN_FIXUPS
];
64 static Fixups FixUps
[2];
65 static Fixups
*fixups
;
67 static int do_not_ignore_hash
= 0;
69 typedef int packing_type
;
70 #define PACK_UNSPEC (0) /* Packing order not specified. */
71 #define PACK_PARALLEL (1) /* "||" */
72 #define PACK_LEFT_RIGHT (2) /* "->" */
73 #define PACK_RIGHT_LEFT (3) /* "<-" */
74 static packing_type etype
= PACK_UNSPEC
; /* Used by d10v_cleanup. */
76 /* TRUE if instruction swapping warnings should be inhibited.
78 static bfd_boolean flag_warn_suppress_instructionswap
;
80 /* TRUE if instruction packing should be performed when --gstabs is specified.
81 --gstabs-packing, --no-gstabs-packing. */
82 static bfd_boolean flag_allow_gstabs_packing
= 1;
84 /* Local functions. */
88 OPTION_NOWARNSWAP
= OPTION_MD_BASE
,
90 OPTION_NOGSTABSPACKING
93 struct option md_longopts
[] =
95 {"nowarnswap", no_argument
, NULL
, OPTION_NOWARNSWAP
},
96 {"gstabspacking", no_argument
, NULL
, OPTION_GSTABSPACKING
},
97 {"gstabs-packing", no_argument
, NULL
, OPTION_GSTABSPACKING
},
98 {"nogstabspacking", no_argument
, NULL
, OPTION_NOGSTABSPACKING
},
99 {"no-gstabs-packing", no_argument
, NULL
, OPTION_NOGSTABSPACKING
},
100 {NULL
, no_argument
, NULL
, 0}
103 size_t md_longopts_size
= sizeof (md_longopts
);
105 /* Opcode hash table. */
106 static struct hash_control
*d10v_hash
;
108 /* Do a binary search of the d10v_predefined_registers array to see if
109 NAME is a valid regiter name. Return the register number from the
110 array on success, or -1 on failure. */
113 reg_name_search (char *name
)
115 int middle
, low
, high
;
119 high
= d10v_reg_name_cnt () - 1;
123 middle
= (low
+ high
) / 2;
124 cmp
= strcasecmp (name
, d10v_predefined_registers
[middle
].name
);
130 return d10v_predefined_registers
[middle
].value
;
136 /* Check the string at input_line_pointer
137 to see if it is a valid register name. */
140 register_name (expressionS
*expressionP
)
143 char c
, *p
= input_line_pointer
;
146 && *p
!= '\n' && *p
!= '\r' && *p
!= ',' && *p
!= ' ' && *p
!= ')')
153 /* Look to see if it's in the register table. */
154 reg_number
= reg_name_search (input_line_pointer
);
157 expressionP
->X_op
= O_register
;
158 /* Temporarily store a pointer to the string here. */
159 expressionP
->X_op_symbol
= (symbolS
*) input_line_pointer
;
160 expressionP
->X_add_number
= reg_number
;
161 input_line_pointer
= p
;
170 check_range (unsigned long num
, int bits
, int flags
)
175 /* Don't bother checking 16-bit values. */
179 if (flags
& OPERAND_SHIFT
)
181 /* All special shift operands are unsigned and <= 16.
182 We allow 0 for now. */
189 if (flags
& OPERAND_SIGNED
)
191 /* Signed 3-bit integers are restricted to the (-2, 3) range. */
192 if (flags
& RESTRICTED_NUM3
)
194 if ((long) num
< -2 || (long) num
> 3)
199 max
= (1 << (bits
- 1)) - 1;
200 min
= - (1 << (bits
- 1));
201 if (((long) num
> max
) || ((long) num
< min
))
207 max
= (1 << bits
) - 1;
209 if (((long) num
> max
) || ((long) num
< min
))
216 md_show_usage (FILE *stream
)
218 fprintf (stream
, _("D10V options:\n\
219 -O Optimize. Will do some operations in parallel.\n\
220 --gstabs-packing Pack adjacent short instructions together even\n\
221 when --gstabs is specified. On by default.\n\
222 --no-gstabs-packing If --gstabs is specified, do not pack adjacent\n\
223 instructions together.\n"));
227 md_parse_option (int c
, char *arg ATTRIBUTE_UNUSED
)
232 /* Optimize. Will attempt to parallelize operations. */
235 case OPTION_NOWARNSWAP
:
236 flag_warn_suppress_instructionswap
= 1;
238 case OPTION_GSTABSPACKING
:
239 flag_allow_gstabs_packing
= 1;
241 case OPTION_NOGSTABSPACKING
:
242 flag_allow_gstabs_packing
= 0;
251 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
257 md_atof (int type
, char *litP
, int *sizeP
)
259 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
263 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
264 asection
*sec ATTRIBUTE_UNUSED
,
265 fragS
*fragP ATTRIBUTE_UNUSED
)
271 md_section_align (asection
*seg
, valueT addr
)
273 int align
= bfd_get_section_alignment (stdoutput
, seg
);
274 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
280 char *prev_name
= "";
281 struct d10v_opcode
*opcode
;
282 d10v_hash
= hash_new ();
284 /* Insert unique names into hash table. The D10v instruction set
285 has many identical opcode names that have different opcodes based
286 on the operands. This hash table then provides a quick index to
287 the first opcode with a particular name in the opcode table. */
289 for (opcode
= (struct d10v_opcode
*) d10v_opcodes
; opcode
->name
; opcode
++)
291 if (strcmp (prev_name
, opcode
->name
))
293 prev_name
= (char *) opcode
->name
;
294 hash_insert (d10v_hash
, opcode
->name
, (char *) opcode
);
299 FixUps
[0].next
= &FixUps
[1];
300 FixUps
[1].next
= &FixUps
[0];
303 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
304 from an expression. */
309 while (*p
!= '-' && *p
!= '+')
311 if (*p
== 0 || *p
== '\n' || *p
== '\r')
330 static bfd_reloc_code_real_type
331 get_reloc (struct d10v_operand
*op
)
338 if (op
->flags
& OPERAND_ADDR
)
341 return BFD_RELOC_D10V_10_PCREL_R
;
343 return BFD_RELOC_D10V_18_PCREL
;
349 /* Parse a string of operands. Return an array of expressions. */
352 get_operands (expressionS exp
[])
354 char *p
= input_line_pointer
;
361 while (*p
== ' ' || *p
== '\t' || *p
== ',')
363 if (*p
== 0 || *p
== '\n' || *p
== '\r')
371 exp
[numops
].X_op
= O_absent
;
375 exp
[numops
].X_add_number
= OPERAND_ATPAR
;
380 exp
[numops
].X_add_number
= OPERAND_ATMINUS
;
384 exp
[numops
].X_add_number
= OPERAND_ATSIGN
;
388 exp
[numops
].X_op
= O_absent
;
389 exp
[numops
].X_add_number
= OPERAND_PLUS
;
400 /* Just skip the trailing paren. */
405 input_line_pointer
= p
;
407 /* Check to see if it might be a register name. */
408 if (!register_name (&exp
[numops
]))
410 /* Parse as an expression. */
413 /* Any expression that involves the indirect addressing
414 cannot also involve immediate addressing. Therefore
415 the use of the hash character is illegal. */
416 int save
= do_not_ignore_hash
;
417 do_not_ignore_hash
= 1;
419 expression (&exp
[numops
]);
421 do_not_ignore_hash
= save
;
424 expression (&exp
[numops
]);
427 if (strncasecmp (input_line_pointer
, "@word", 5) == 0)
429 input_line_pointer
+= 5;
430 if (exp
[numops
].X_op
== O_register
)
432 /* If it looked like a register name but was followed by
433 "@word" then it was really a symbol, so change it to
435 exp
[numops
].X_op
= O_symbol
;
436 exp
[numops
].X_add_symbol
=
437 symbol_find_or_make ((char *) exp
[numops
].X_op_symbol
);
440 /* Check for identifier@word+constant. */
441 if (*input_line_pointer
== '-' || *input_line_pointer
== '+')
444 expression (&new_exp
);
445 exp
[numops
].X_add_number
= new_exp
.X_add_number
;
448 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */
451 memset (&new_exp
, 0, sizeof new_exp
);
452 new_exp
.X_add_number
= AT_WORD_RIGHT_SHIFT
;
453 new_exp
.X_op
= O_constant
;
454 new_exp
.X_unsigned
= 1;
455 exp
[numops
].X_op_symbol
= make_expr_symbol (&new_exp
);
456 exp
[numops
].X_op
= O_right_shift
;
459 know (AT_WORD_P (&exp
[numops
]));
462 if (exp
[numops
].X_op
== O_illegal
)
463 as_bad (_("illegal operand"));
464 else if (exp
[numops
].X_op
== O_absent
)
465 as_bad (_("missing operand"));
468 p
= input_line_pointer
;
473 case -1: /* Postdecrement mode. */
474 exp
[numops
].X_op
= O_absent
;
475 exp
[numops
++].X_add_number
= OPERAND_MINUS
;
477 case 1: /* Postincrement mode. */
478 exp
[numops
].X_op
= O_absent
;
479 exp
[numops
++].X_add_number
= OPERAND_PLUS
;
483 exp
[numops
].X_op
= 0;
488 d10v_insert_operand (unsigned long insn
,
496 shift
= d10v_operands
[op_type
].shift
;
500 bits
= d10v_operands
[op_type
].bits
;
502 /* Truncate to the proper number of bits. */
503 if (check_range (value
, bits
, d10v_operands
[op_type
].flags
))
504 as_bad_where (fix
->fx_file
, fix
->fx_line
,
505 _("operand out of range: %ld"), (long) value
);
507 value
&= 0x7FFFFFFF >> (31 - bits
);
508 insn
|= (value
<< shift
);
513 /* Take a pointer to the opcode entry in the opcode table and the
514 array of operand expressions. Return the instruction. */
517 build_insn (struct d10v_opcode
*opcode
,
521 int i
, bits
, shift
, flags
, format
;
522 unsigned long number
;
524 /* The insn argument is only used for the DIVS kludge. */
529 insn
= opcode
->opcode
;
530 format
= opcode
->format
;
533 for (i
= 0; opcode
->operands
[i
]; i
++)
535 flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
536 bits
= d10v_operands
[opcode
->operands
[i
]].bits
;
537 shift
= d10v_operands
[opcode
->operands
[i
]].shift
;
538 number
= opers
[i
].X_add_number
;
540 if (flags
& OPERAND_REG
)
542 number
&= REGISTER_MASK
;
543 if (format
== LONG_L
)
547 if (opers
[i
].X_op
!= O_register
&& opers
[i
].X_op
!= O_constant
)
549 /* Now create a fixup. */
551 if (fixups
->fc
>= MAX_INSN_FIXUPS
)
552 as_fatal (_("too many fixups"));
554 if (AT_WORD_P (&opers
[i
]))
556 /* Recognize XXX>>1+N aka XXX@word+N as special (AT_WORD). */
557 fixups
->fix
[fixups
->fc
].reloc
= BFD_RELOC_D10V_18
;
558 opers
[i
].X_op
= O_symbol
;
559 opers
[i
].X_op_symbol
= NULL
; /* Should free it. */
560 /* number is left shifted by AT_WORD_RIGHT_SHIFT so
561 that, it is aligned with the symbol's value. Later,
562 BFD_RELOC_D10V_18 will right shift (symbol_value +
564 number
<<= AT_WORD_RIGHT_SHIFT
;
565 opers
[i
].X_add_number
= number
;
569 fixups
->fix
[fixups
->fc
].reloc
=
570 get_reloc ((struct d10v_operand
*) &d10v_operands
[opcode
->operands
[i
]]);
572 /* Check that an immediate was passed to ops that expect one. */
573 if ((flags
& OPERAND_NUM
)
574 && (fixups
->fix
[fixups
->fc
].reloc
== 0))
575 as_bad (_("operand is not an immediate"));
578 if (fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_16
||
579 fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_D10V_18
)
580 fixups
->fix
[fixups
->fc
].size
= 2;
582 fixups
->fix
[fixups
->fc
].size
= 4;
584 fixups
->fix
[fixups
->fc
].exp
= opers
[i
];
585 fixups
->fix
[fixups
->fc
].operand
= opcode
->operands
[i
];
586 fixups
->fix
[fixups
->fc
].pcrel
=
587 (flags
& OPERAND_ADDR
) ? TRUE
: FALSE
;
591 /* Truncate to the proper number of bits. */
592 if ((opers
[i
].X_op
== O_constant
) && check_range (number
, bits
, flags
))
593 as_bad (_("operand out of range: %lu"), number
);
594 number
&= 0x7FFFFFFF >> (31 - bits
);
595 insn
= insn
| (number
<< shift
);
598 /* kludge: for DIVS, we need to put the operands in twice on the second
599 pass, format is changed to LONG_R to force the second set of operands
600 to not be shifted over 15. */
601 if ((opcode
->opcode
== OPCODE_DIVS
) && (format
== LONG_L
))
602 insn
= build_insn (opcode
, opers
, insn
);
607 /* Write out a long form instruction. */
610 write_long (unsigned long insn
, Fixups
*fx
)
613 char *f
= frag_more (4);
615 dwarf2_emit_insn (4);
617 number_to_chars_bigendian (f
, insn
, 4);
619 for (i
= 0; i
< fx
->fc
; i
++)
621 if (fx
->fix
[i
].reloc
)
623 where
= f
- frag_now
->fr_literal
;
624 if (fx
->fix
[i
].size
== 2)
627 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
628 fx
->fix
[i
].operand
|= 4096;
630 fix_new_exp (frag_now
,
635 fx
->fix
[i
].operand
|2048);
641 /* Write out a short form instruction by itself. */
644 write_1_short (struct d10v_opcode
*opcode
,
648 char *f
= frag_more (4);
651 dwarf2_emit_insn (4);
652 if (opcode
->exec_type
& PARONLY
)
653 as_fatal (_("Instruction must be executed in parallel with another instruction."));
655 /* The other container needs to be NOP.
656 According to 4.3.1: for FM=00, sub-instructions performed only by IU
657 cannot be encoded in L-container. */
658 if (opcode
->unit
== IU
)
659 insn
|= FM00
| (NOP
<< 15); /* Right container. */
661 insn
= FM00
| (insn
<< 15) | NOP
; /* Left container. */
663 number_to_chars_bigendian (f
, insn
, 4);
664 for (i
= 0; i
< fx
->fc
; i
++)
666 if (fx
->fix
[i
].reloc
)
668 where
= f
- frag_now
->fr_literal
;
669 if (fx
->fix
[i
].size
== 2)
672 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
673 fx
->fix
[i
].operand
|= 4096;
675 /* If it's an R reloc, we may have to switch it to L. */
676 if ((fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
)
677 && (opcode
->unit
!= IU
))
678 fx
->fix
[i
].operand
|= 1024;
680 fix_new_exp (frag_now
,
685 fx
->fix
[i
].operand
|2048);
691 /* Determine if there are any resource conflicts among two manually
692 parallelized instructions. Some of this was lifted from parallel_ok. */
695 check_resource_conflict (struct d10v_opcode
*op1
,
697 struct d10v_opcode
*op2
,
700 int i
, j
, flags
, mask
, shift
, regno
;
701 unsigned long ins
, mod
[2];
702 struct d10v_opcode
*op
;
704 if ((op1
->exec_type
& SEQ
)
705 || ! ((op1
->exec_type
& PAR
) || (op1
->exec_type
& PARONLY
)))
707 as_warn (_("packing conflict: %s must dispatch sequentially"),
712 if ((op2
->exec_type
& SEQ
)
713 || ! ((op2
->exec_type
& PAR
) || (op2
->exec_type
& PARONLY
)))
715 as_warn (_("packing conflict: %s must dispatch sequentially"),
720 /* See if both instructions write to the same resource.
722 The idea here is to create two sets of bitmasks (mod and used) which
723 indicate which registers are modified or used by each instruction.
724 The operation can only be done in parallel if neither instruction
725 modifies the same register. Accesses to control registers and memory
726 are treated as accesses to a single register. So if both instructions
727 write memory or if the first instruction writes memory and the second
728 reads, then they cannot be done in parallel. We treat reads to the PSW
729 (which includes C, F0, and F1) in isolation. So simultaneously writing
730 C and F0 in two different sub-instructions is permitted. */
732 /* The bitmasks (mod and used) look like this (bit 31 = MSB).
741 for (j
= 0; j
< 2; j
++)
754 if (op
->exec_type
& BRANCH_LINK
)
757 for (i
= 0; op
->operands
[i
]; i
++)
759 flags
= d10v_operands
[op
->operands
[i
]].flags
;
760 shift
= d10v_operands
[op
->operands
[i
]].shift
;
761 mask
= 0x7FFFFFFF >> (31 - d10v_operands
[op
->operands
[i
]].bits
);
762 if (flags
& OPERAND_REG
)
764 regno
= (ins
>> shift
) & mask
;
765 if (flags
& (OPERAND_ACC0
| OPERAND_ACC1
))
767 else if (flags
& OPERAND_CONTROL
) /* mvtc or mvfc */
774 else if (flags
& OPERAND_FFLAG
)
776 else if (flags
& OPERAND_CFLAG
)
779 if (flags
& OPERAND_DEST
780 /* Auto inc/dec also modifies the register. */
781 || (op
->operands
[i
+ 1] != 0
782 && (d10v_operands
[op
->operands
[i
+ 1]].flags
783 & (OPERAND_PLUS
| OPERAND_MINUS
)) != 0))
785 mod
[j
] |= 1 << regno
;
786 if (flags
& OPERAND_EVEN
)
787 mod
[j
] |= 1 << (regno
+ 1);
790 else if (flags
& OPERAND_ATMINUS
)
792 /* SP implicitly used/modified. */
797 if (op
->exec_type
& WMEM
)
799 else if (op
->exec_type
& WF0
)
801 else if (op
->exec_type
& WCAR
)
805 if ((mod
[0] & mod
[1]) == 0)
812 for (j
= 0; j
<= 15; j
++)
814 as_warn (_("resource conflict (R%d)"), j
);
815 for (j
= 16; j
<= 17; j
++)
817 as_warn (_("resource conflict (A%d)"), j
- 16);
819 as_warn (_("resource conflict (PSW)"));
821 as_warn (_("resource conflict (C flag)"));
823 as_warn (_("resource conflict (F flag)"));
827 /* Check 2 instructions and determine if they can be safely
828 executed in parallel. Return 1 if they can be. */
831 parallel_ok (struct d10v_opcode
*op1
,
833 struct d10v_opcode
*op2
,
835 packing_type exec_type
)
837 int i
, j
, flags
, mask
, shift
, regno
;
838 unsigned long ins
, mod
[2], used
[2];
839 struct d10v_opcode
*op
;
841 if ((op1
->exec_type
& SEQ
) != 0 || (op2
->exec_type
& SEQ
) != 0
842 || (op1
->exec_type
& PAR
) == 0 || (op2
->exec_type
& PAR
) == 0
843 || (op1
->unit
== BOTH
) || (op2
->unit
== BOTH
)
844 || (op1
->unit
== IU
&& op2
->unit
== IU
)
845 || (op1
->unit
== MU
&& op2
->unit
== MU
))
848 /* If this is auto parallelization, and the first instruction is a
849 branch or should not be packed, then don't parallelize. */
850 if (exec_type
== PACK_UNSPEC
851 && (op1
->exec_type
& (ALONE
| BRANCH
)))
854 /* The idea here is to create two sets of bitmasks (mod and used)
855 which indicate which registers are modified or used by each
856 instruction. The operation can only be done in parallel if
857 instruction 1 and instruction 2 modify different registers, and
858 the first instruction does not modify registers that the second
859 is using (The second instruction can modify registers that the
860 first is using as they are only written back after the first
861 instruction has completed). Accesses to control registers, PSW,
862 and memory are treated as accesses to a single register. So if
863 both instructions write memory or if the first instruction writes
864 memory and the second reads, then they cannot be done in
865 parallel. Likewise, if the first instruction mucks with the psw
866 and the second reads the PSW (which includes C, F0, and F1), then
867 they cannot operate safely in parallel. */
869 /* The bitmasks (mod and used) look like this (bit 31 = MSB).
876 for (j
= 0; j
< 2; j
++)
888 mod
[j
] = used
[j
] = 0;
889 if (op
->exec_type
& BRANCH_LINK
)
892 for (i
= 0; op
->operands
[i
]; i
++)
894 flags
= d10v_operands
[op
->operands
[i
]].flags
;
895 shift
= d10v_operands
[op
->operands
[i
]].shift
;
896 mask
= 0x7FFFFFFF >> (31 - d10v_operands
[op
->operands
[i
]].bits
);
897 if (flags
& OPERAND_REG
)
899 regno
= (ins
>> shift
) & mask
;
900 if (flags
& (OPERAND_ACC0
| OPERAND_ACC1
))
902 else if (flags
& OPERAND_CONTROL
) /* mvtc or mvfc. */
909 else if (flags
& (OPERAND_FFLAG
| OPERAND_CFLAG
))
912 if (flags
& OPERAND_DEST
)
914 mod
[j
] |= 1 << regno
;
915 if (flags
& OPERAND_EVEN
)
916 mod
[j
] |= 1 << (regno
+ 1);
920 used
[j
] |= 1 << regno
;
921 if (flags
& OPERAND_EVEN
)
922 used
[j
] |= 1 << (regno
+ 1);
924 /* Auto inc/dec also modifies the register. */
925 if (op
->operands
[i
+ 1] != 0
926 && (d10v_operands
[op
->operands
[i
+ 1]].flags
927 & (OPERAND_PLUS
| OPERAND_MINUS
)) != 0)
928 mod
[j
] |= 1 << regno
;
931 else if (flags
& OPERAND_ATMINUS
)
933 /* SP implicitly used/modified. */
938 if (op
->exec_type
& RMEM
)
940 else if (op
->exec_type
& WMEM
)
942 else if (op
->exec_type
& RF0
)
944 else if (op
->exec_type
& WF0
)
946 else if (op
->exec_type
& WCAR
)
949 if ((mod
[0] & mod
[1]) == 0 && (mod
[0] & used
[1]) == 0)
954 /* Expects two short instructions.
955 If possible, writes out both as a single packed instruction.
956 Otherwise, writes out the first one, packed with a NOP.
957 Returns number of instructions not written out. */
960 write_2_short (struct d10v_opcode
*opcode1
,
962 struct d10v_opcode
*opcode2
,
964 packing_type exec_type
,
971 if ((exec_type
!= PACK_PARALLEL
)
972 && ((opcode1
->exec_type
& PARONLY
) || (opcode2
->exec_type
& PARONLY
)))
973 as_fatal (_("Instruction must be executed in parallel"));
975 if ((opcode1
->format
& LONG_OPCODE
) || (opcode2
->format
& LONG_OPCODE
))
976 as_fatal (_("Long instructions may not be combined."));
980 case PACK_UNSPEC
: /* Order not specified. */
981 if (opcode1
->exec_type
& ALONE
)
983 /* Case of a short branch on a separate GAS line. Pack with NOP. */
984 write_1_short (opcode1
, insn1
, fx
->next
);
988 && parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
))
991 if (opcode1
->unit
== IU
)
992 insn
= FM00
| (insn2
<< 15) | insn1
;
993 else if (opcode2
->unit
== MU
)
994 insn
= FM00
| (insn2
<< 15) | insn1
;
996 insn
= FM00
| (insn1
<< 15) | insn2
;
998 else if (opcode1
->unit
== IU
)
999 /* Reverse sequential with IU opcode1 on right and done first. */
1000 insn
= FM10
| (insn2
<< 15) | insn1
;
1002 /* Sequential with non-IU opcode1 on left and done first. */
1003 insn
= FM01
| (insn1
<< 15) | insn2
;
1007 if (opcode1
->exec_type
& SEQ
|| opcode2
->exec_type
& SEQ
)
1009 (_("One of these instructions may not be executed in parallel."));
1010 if (opcode1
->unit
== IU
)
1012 if (opcode2
->unit
== IU
)
1013 as_fatal (_("Two IU instructions may not be executed in parallel"));
1014 if (!flag_warn_suppress_instructionswap
)
1015 as_warn (_("Swapping instruction order"));
1016 insn
= FM00
| (insn2
<< 15) | insn1
;
1018 else if (opcode2
->unit
== MU
)
1020 if (opcode1
->unit
== MU
)
1021 as_fatal (_("Two MU instructions may not be executed in parallel"));
1022 if (!flag_warn_suppress_instructionswap
)
1023 as_warn (_("Swapping instruction order"));
1024 insn
= FM00
| (insn2
<< 15) | insn1
;
1027 insn
= FM00
| (insn1
<< 15) | insn2
;
1028 check_resource_conflict (opcode1
, insn1
, opcode2
, insn2
);
1031 case PACK_LEFT_RIGHT
:
1032 if (opcode1
->unit
!= IU
)
1033 insn
= FM01
| (insn1
<< 15) | insn2
;
1034 else if (opcode2
->unit
== MU
|| opcode2
->unit
== EITHER
)
1036 if (!flag_warn_suppress_instructionswap
)
1037 as_warn (_("Swapping instruction order"));
1038 insn
= FM10
| (insn2
<< 15) | insn1
;
1041 as_fatal (_("IU instruction may not be in the left container"));
1042 if (opcode1
->exec_type
& ALONE
)
1043 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1046 case PACK_RIGHT_LEFT
:
1047 if (opcode2
->unit
!= MU
)
1048 insn
= FM10
| (insn1
<< 15) | insn2
;
1049 else if (opcode1
->unit
== IU
|| opcode1
->unit
== EITHER
)
1051 if (!flag_warn_suppress_instructionswap
)
1052 as_warn (_("Swapping instruction order"));
1053 insn
= FM01
| (insn2
<< 15) | insn1
;
1056 as_fatal (_("MU instruction may not be in the right container"));
1057 if (opcode2
->exec_type
& ALONE
)
1058 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1062 as_fatal (_("unknown execution type passed to write_2_short()"));
1066 dwarf2_emit_insn (4);
1067 number_to_chars_bigendian (f
, insn
, 4);
1069 /* Process fixup chains. fx refers to insn2 when j == 0, and to
1070 insn1 when j == 1. Yes, it's reversed. */
1072 for (j
= 0; j
< 2; j
++)
1074 for (i
= 0; i
< fx
->fc
; i
++)
1076 if (fx
->fix
[i
].reloc
)
1078 where
= f
- frag_now
->fr_literal
;
1079 if (fx
->fix
[i
].size
== 2)
1082 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
1083 /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to
1084 the instruction in the L container has to be
1085 adjusted to BDF_RELOC_D10V_10_PCREL_L. When
1086 j==0, we're processing insn2's operands, so we
1087 want to mark the operand if insn2 is *not* in the
1088 R container. When j==1, we're processing insn1's
1089 operands, so we want to mark the operand if insn2
1090 *is* in the R container. Note that, if two
1091 instructions are identical, we're never going to
1092 swap them, so the test is safe. */
1093 && j
== ((insn
& 0x7fff) == insn2
))
1094 fx
->fix
[i
].operand
|= 1024;
1096 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
1097 fx
->fix
[i
].operand
|= 4096;
1099 fix_new_exp (frag_now
,
1104 fx
->fix
[i
].operand
|2048);
1113 /* This is the main entry point for the machine-dependent assembler.
1114 str points to a machine-dependent instruction. This function is
1115 supposed to emit the frags/bytes it assembles to. For the D10V, it
1116 mostly handles the special VLIW parsing and packing and leaves the
1117 difficult stuff to do_assemble(). */
1119 static unsigned long prev_insn
;
1120 static struct d10v_opcode
*prev_opcode
= 0;
1121 static subsegT prev_subseg
;
1122 static segT prev_seg
= 0;;
1124 /* Find the symbol which has the same name as the register in exp. */
1127 find_symbol_matching_register (expressionS
*exp
)
1131 if (exp
->X_op
!= O_register
)
1134 /* Find the name of the register. */
1135 for (i
= d10v_reg_name_cnt (); i
--;)
1136 if (d10v_predefined_registers
[i
].value
== exp
->X_add_number
)
1142 /* Now see if a symbol has been defined with the same name. */
1143 return symbol_find (d10v_predefined_registers
[i
].name
);
1146 /* Get a pointer to an entry in the opcode table.
1147 The function must look at all opcodes with the same name and use
1148 the operands to choose the correct opcode. */
1150 static struct d10v_opcode
*
1151 find_opcode (struct d10v_opcode
*opcode
, expressionS myops
[])
1154 struct d10v_opcode
*next_opcode
;
1156 /* Get all the operands and save them as expressions. */
1157 get_operands (myops
);
1159 /* Now see if the operand is a fake. If so, find the correct size
1160 instruction, if possible. */
1161 if (opcode
->format
== OPCODE_FAKE
)
1163 int opnum
= opcode
->operands
[0];
1166 if (myops
[opnum
].X_op
== O_register
)
1168 myops
[opnum
].X_op
= O_symbol
;
1169 myops
[opnum
].X_add_symbol
=
1170 symbol_find_or_make ((char *) myops
[opnum
].X_op_symbol
);
1171 myops
[opnum
].X_add_number
= 0;
1172 myops
[opnum
].X_op_symbol
= NULL
;
1175 next_opcode
= opcode
+ 1;
1177 /* If the first operand is supposed to be a register, make sure
1178 we got a valid one. */
1179 flags
= d10v_operands
[next_opcode
->operands
[0]].flags
;
1180 if (flags
& OPERAND_REG
)
1182 int X_op
= myops
[0].X_op
;
1183 int num
= myops
[0].X_add_number
;
1185 if (X_op
!= O_register
1187 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1188 | OPERAND_FFLAG
| OPERAND_CFLAG
| OPERAND_CONTROL
))
1189 || ((flags
& OPERAND_SP
) && ! (num
& OPERAND_SP
)))
1191 as_bad (_("bad opcode or operands"));
1196 if (myops
[opnum
].X_op
== O_constant
1197 || (myops
[opnum
].X_op
== O_symbol
1198 && S_IS_DEFINED (myops
[opnum
].X_add_symbol
)
1199 && (S_GET_SEGMENT (myops
[opnum
].X_add_symbol
) == now_seg
)))
1201 for (i
= 0; opcode
->operands
[i
+ 1]; i
++)
1203 int bits
= d10v_operands
[next_opcode
->operands
[opnum
]].bits
;
1205 flags
= d10v_operands
[next_opcode
->operands
[opnum
]].flags
;
1207 if (flags
& OPERAND_ADDR
)
1210 if (myops
[opnum
].X_op
== O_constant
)
1212 if (!check_range (myops
[opnum
].X_add_number
, bits
, flags
))
1219 unsigned long current_position
;
1220 unsigned long symbol_position
;
1221 unsigned long value
;
1222 bfd_boolean found_symbol
;
1224 /* Calculate the address of the current instruction
1225 and the address of the symbol. Do this by summing
1226 the offsets of previous frags until we reach the
1227 frag containing the symbol, and the current frag. */
1228 sym_frag
= symbol_get_frag (myops
[opnum
].X_add_symbol
);
1229 found_symbol
= FALSE
;
1232 obstack_next_free (&frchain_now
->frch_obstack
)
1233 - frag_now
->fr_literal
;
1234 symbol_position
= S_GET_VALUE (myops
[opnum
].X_add_symbol
);
1236 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1238 current_position
+= f
->fr_fix
+ f
->fr_offset
;
1241 found_symbol
= TRUE
;
1244 symbol_position
+= f
->fr_fix
+ f
->fr_offset
;
1247 value
= symbol_position
;
1249 if (flags
& OPERAND_ADDR
)
1250 value
-= current_position
;
1252 if (AT_WORD_P (&myops
[opnum
]))
1257 if (!check_range (value
, bits
, flags
))
1261 else if (!check_range (value
, bits
, flags
))
1267 if (opcode
->operands
[i
+ 1] == 0)
1268 as_fatal (_("value out of range"));
1270 opcode
= next_opcode
;
1273 /* Not a constant, so use a long instruction. */
1279 /* Now search the opcode table table for one with operands
1280 that matches what we've got. */
1284 for (i
= 0; opcode
->operands
[i
]; i
++)
1286 int flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
1287 int X_op
= myops
[i
].X_op
;
1288 int num
= myops
[i
].X_add_number
;
1296 if (flags
& OPERAND_REG
)
1298 if ((X_op
!= O_register
)
1300 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1301 | OPERAND_FFLAG
| OPERAND_CFLAG
1303 || ((flags
& OPERAND_SP
) && ! (num
& OPERAND_SP
)))
1310 if (((flags
& OPERAND_MINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_MINUS
))) ||
1311 ((flags
& OPERAND_PLUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_PLUS
))) ||
1312 ((flags
& OPERAND_ATMINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATMINUS
))) ||
1313 ((flags
& OPERAND_ATPAR
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATPAR
))) ||
1314 ((flags
& OPERAND_ATSIGN
) && ((X_op
!= O_absent
) || ((num
!= OPERAND_ATSIGN
) && (num
!= OPERAND_ATPAR
)))))
1320 /* Unfortunately, for the indirect operand in instructions such
1321 as ``ldb r1, @(c,r14)'' this function can be passed
1322 X_op == O_register (because 'c' is a valid register name).
1323 However we cannot just ignore the case when X_op == O_register
1324 but flags & OPERAND_REG is null, so we check to see if a symbol
1325 of the same name as the register exists. If the symbol does
1326 exist, then the parser was unable to distinguish the two cases
1327 and we fix things here. (Ref: PR14826) */
1329 if (!(flags
& OPERAND_REG
) && (X_op
== O_register
))
1333 sym
= find_symbol_matching_register (& myops
[i
]);
1337 myops
[i
].X_op
= X_op
= O_symbol
;
1338 myops
[i
].X_add_symbol
= sym
;
1342 (_("illegal operand - register name found where none expected"));
1346 /* We're only done if the operands matched so far AND there
1347 are no more to check. */
1348 if (match
&& myops
[i
].X_op
== 0)
1353 next_opcode
= opcode
+ 1;
1355 if (next_opcode
->opcode
== 0)
1358 if (strcmp (next_opcode
->name
, opcode
->name
))
1361 opcode
= next_opcode
;
1366 as_bad (_("bad opcode or operands"));
1370 /* Check that all registers that are required to be even are.
1371 Also, if any operands were marked as registers, but were really symbols,
1373 for (i
= 0; opcode
->operands
[i
]; i
++)
1375 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_EVEN
) &&
1376 (myops
[i
].X_add_number
& 1))
1377 as_fatal (_("Register number must be EVEN"));
1378 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_NOSP
)
1379 && (myops
[i
].X_add_number
& OPERAND_SP
))
1380 as_bad (_("Unsupported use of sp"));
1381 if (myops
[i
].X_op
== O_register
)
1383 if (!(d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_REG
))
1385 myops
[i
].X_op
= O_symbol
;
1386 myops
[i
].X_add_symbol
=
1387 symbol_find_or_make ((char *) myops
[i
].X_op_symbol
);
1388 myops
[i
].X_add_number
= 0;
1389 myops
[i
].X_op_symbol
= NULL
;
1392 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_CONTROL
)
1393 && (myops
[i
].X_add_number
== OPERAND_CONTROL
+ 4
1394 || myops
[i
].X_add_number
== OPERAND_CONTROL
+ 5
1395 || myops
[i
].X_add_number
== OPERAND_CONTROL
+ 6
1396 || myops
[i
].X_add_number
== OPERAND_CONTROL
+ 12
1397 || myops
[i
].X_add_number
== OPERAND_CONTROL
+ 13
1398 || myops
[i
].X_add_number
== OPERAND_CONTROL
+ 15))
1399 as_warn (_("cr%ld is a reserved control register"),
1400 myops
[i
].X_add_number
- OPERAND_CONTROL
);
1405 /* Assemble a single instruction.
1406 Return an opcode, or -1 (an invalid opcode) on error. */
1408 static unsigned long
1409 do_assemble (char *str
, struct d10v_opcode
**opcode
)
1411 unsigned char *op_start
, *op_end
;
1415 expressionS myops
[6];
1417 /* Drop leading whitespace. */
1421 /* Find the opcode end. */
1422 for (op_start
= op_end
= (unsigned char *) str
;
1423 *op_end
&& !is_end_of_line
[*op_end
] && *op_end
!= ' ';
1426 name
[nlen
] = TOLOWER (op_start
[nlen
]);
1428 if (nlen
== sizeof (name
) - 1)
1436 /* Find the first opcode with the proper name. */
1437 *opcode
= (struct d10v_opcode
*) hash_find (d10v_hash
, name
);
1438 if (*opcode
== NULL
)
1441 save
= input_line_pointer
;
1442 input_line_pointer
= (char *) op_end
;
1443 *opcode
= find_opcode (*opcode
, myops
);
1446 input_line_pointer
= save
;
1448 return build_insn ((*opcode
), myops
, 0);
1451 /* If while processing a fixup, a reloc really needs to be created.
1452 Then it is done here. */
1455 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
1458 reloc
= xmalloc (sizeof (arelent
));
1459 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1460 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1461 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1462 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1463 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1465 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1466 _("reloc %d not supported by object file format"),
1467 (int) fixp
->fx_r_type
);
1471 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1472 reloc
->address
= fixp
->fx_offset
;
1480 md_estimate_size_before_relax (fragS
*fragp ATTRIBUTE_UNUSED
,
1481 asection
*seg ATTRIBUTE_UNUSED
)
1488 md_pcrel_from_section (fixS
*fixp
, segT sec
)
1490 if (fixp
->fx_addsy
!= (symbolS
*) NULL
1491 && (!S_IS_DEFINED (fixp
->fx_addsy
)
1492 || (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1494 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1498 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
1506 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1509 /* We don't actually support subtracting a symbol. */
1510 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1511 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1513 op_type
= fixP
->fx_r_type
;
1520 fixP
->fx_r_type
= BFD_RELOC_D10V_10_PCREL_L
;
1523 else if (op_type
& 4096)
1526 fixP
->fx_r_type
= BFD_RELOC_D10V_18
;
1530 get_reloc ((struct d10v_operand
*) &d10v_operands
[op_type
]);
1533 /* Fetch the instruction, insert the fully resolved operand
1534 value, and stuff the instruction back again. */
1535 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1536 insn
= bfd_getb32 ((unsigned char *) where
);
1538 switch (fixP
->fx_r_type
)
1540 case BFD_RELOC_D10V_10_PCREL_L
:
1541 case BFD_RELOC_D10V_10_PCREL_R
:
1542 case BFD_RELOC_D10V_18_PCREL
:
1543 /* If the fix is relative to a global symbol, not a section
1544 symbol, then ignore the offset.
1545 XXX - Do we have to worry about branches to a symbol + offset ? */
1546 if (fixP
->fx_addsy
!= NULL
1547 && S_IS_EXTERNAL (fixP
->fx_addsy
) )
1549 segT fseg
= S_GET_SEGMENT (fixP
->fx_addsy
);
1550 segment_info_type
*segf
= seg_info(fseg
);
1552 if ( segf
&& segf
->sym
!= fixP
->fx_addsy
)
1556 case BFD_RELOC_D10V_18
:
1557 /* Instruction addresses are always right-shifted by 2. */
1558 value
>>= AT_WORD_RIGHT_SHIFT
;
1559 if (fixP
->fx_size
== 2)
1560 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1563 struct d10v_opcode
*rep
, *repi
;
1565 rep
= (struct d10v_opcode
*) hash_find (d10v_hash
, "rep");
1566 repi
= (struct d10v_opcode
*) hash_find (d10v_hash
, "repi");
1567 if ((insn
& FM11
) == FM11
1569 && (insn
& repi
->mask
) == (unsigned) repi
->opcode
)
1571 && (insn
& rep
->mask
) == (unsigned) rep
->opcode
))
1574 (_("line %d: rep or repi must include at least 4 instructions"),
1577 d10v_insert_operand (insn
, op_type
, (offsetT
) value
, left
, fixP
);
1578 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1582 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1585 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1588 case BFD_RELOC_VTABLE_INHERIT
:
1589 case BFD_RELOC_VTABLE_ENTRY
:
1594 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1595 fixP
->fx_line
, fixP
->fx_r_type
);
1599 /* d10v_cleanup() is called after the assembler has finished parsing
1600 the input file, when a label is read from the input file, or when a
1601 stab directive is output. Because the D10V assembler sometimes
1602 saves short instructions to see if it can package them with the
1603 next instruction, there may be a short instruction that still needs
1606 NOTE: accesses a global, etype.
1607 NOTE: invoked by various macros such as md_cleanup: see. */
1615 /* If cleanup was invoked because the assembler encountered, e.g., a
1616 user label, we write out the pending instruction, if any. If it
1617 was invoked because the assembler is outputting a piece of line
1618 debugging information, though, we write out the pending
1619 instruction only if the --no-gstabs-packing command line switch
1620 has been specified. */
1622 && etype
== PACK_UNSPEC
1623 && (! outputting_stabs_line_debug
|| ! flag_allow_gstabs_packing
))
1626 subseg
= now_subseg
;
1629 subseg_set (prev_seg
, prev_subseg
);
1631 write_1_short (prev_opcode
, prev_insn
, fixups
->next
);
1632 subseg_set (seg
, subseg
);
1639 d10v_frob_label (symbolS
*lab
)
1642 symbol_set_frag (lab
, frag_now
);
1643 S_SET_VALUE (lab
, (valueT
) frag_now_fix ());
1644 dwarf2_emit_label (lab
);
1647 /* Like normal .word, except support @word.
1648 Clobbers input_line_pointer, checks end-of-line. */
1651 d10v_dot_word (int dummy ATTRIBUTE_UNUSED
)
1656 if (is_it_end_of_statement ())
1658 demand_empty_rest_of_line ();
1665 if (!strncasecmp (input_line_pointer
, "@word", 5))
1667 exp
.X_add_number
= 0;
1668 input_line_pointer
+= 5;
1671 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 2,
1672 &exp
, 0, BFD_RELOC_D10V_18
);
1675 emit_expr (&exp
, 2);
1677 while (*input_line_pointer
++ == ',');
1679 input_line_pointer
--; /* Put terminator back into stream. */
1680 demand_empty_rest_of_line ();
1683 /* Mitsubishi asked that we support some old syntax that apparently
1684 had immediate operands starting with '#'. This is in some of their
1685 sample code but is not documented (although it appears in some
1686 examples in their assembler manual). For now, we'll solve this
1687 compatibility problem by simply ignoring any '#' at the beginning
1690 /* Operands that begin with '#' should fall through to here.
1694 md_operand (expressionS
*expressionP
)
1696 if (*input_line_pointer
== '#' && ! do_not_ignore_hash
)
1698 input_line_pointer
++;
1699 expression (expressionP
);
1704 d10v_fix_adjustable (fixS
*fixP
)
1706 /* We need the symbol name for the VTABLE entries. */
1707 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1708 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1714 /* The target specific pseudo-ops which we support. */
1715 const pseudo_typeS md_pseudo_table
[] =
1717 { "word", d10v_dot_word
, 2 },
1722 md_assemble (char *str
)
1724 /* etype is saved extype. For multi-line instructions. */
1725 packing_type extype
= PACK_UNSPEC
; /* Parallel, etc. */
1726 struct d10v_opcode
*opcode
;
1730 if (etype
== PACK_UNSPEC
)
1732 /* Look for the special multiple instruction separators. */
1733 str2
= strstr (str
, "||");
1735 extype
= PACK_PARALLEL
;
1738 str2
= strstr (str
, "->");
1740 extype
= PACK_LEFT_RIGHT
;
1743 str2
= strstr (str
, "<-");
1745 extype
= PACK_RIGHT_LEFT
;
1749 /* str2 points to the separator, if there is one. */
1754 /* If two instructions are present and we already have one saved,
1755 then first write out the saved one. */
1758 /* Assemble first instruction and save it. */
1759 prev_insn
= do_assemble (str
, &prev_opcode
);
1761 prev_subseg
= now_subseg
;
1762 if (prev_insn
== (unsigned long) -1)
1763 as_fatal (_("can't find previous opcode "));
1764 fixups
= fixups
->next
;
1769 insn
= do_assemble (str
, &opcode
);
1770 if (insn
== (unsigned long) -1)
1772 if (extype
!= PACK_UNSPEC
)
1775 as_bad (_("could not assemble: %s"), str
);
1779 if (etype
!= PACK_UNSPEC
)
1782 etype
= PACK_UNSPEC
;
1785 /* If this is a long instruction, write it and any previous short
1787 if (opcode
->format
& LONG_OPCODE
)
1789 if (extype
!= PACK_UNSPEC
)
1790 as_fatal (_("Unable to mix instructions as specified"));
1792 write_long (insn
, fixups
);
1799 && ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1803 && (0 == write_2_short (prev_opcode
, prev_insn
, opcode
, insn
, extype
,
1806 /* No instructions saved. */
1811 if (extype
!= PACK_UNSPEC
)
1812 as_fatal (_("Unable to mix instructions as specified"));
1813 /* Save last instruction so it may be packed on next pass. */
1814 prev_opcode
= opcode
;
1817 prev_subseg
= now_subseg
;
1818 fixups
= fixups
->next
;