1 /* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS 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, or (at your option)
12 GAS 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 GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "safe-ctype.h"
26 #include "opcode/d30v.h"
28 const char comment_chars
[] = ";";
29 const char line_comment_chars
[] = "#";
30 const char line_separator_chars
[] = "";
31 const char *md_shortopts
= "OnNcC";
32 const char EXP_CHARS
[] = "eE";
33 const char FLT_CHARS
[] = "dD";
43 #define NOP_MULTIPLY 1
45 static int warn_nops
= 0;
46 static int Optimizing
= 0;
47 static int warn_register_name_conflicts
= 1;
53 typedef enum _exec_type
55 EXEC_UNKNOWN
, /* no order specified */
56 EXEC_PARALLEL
, /* done in parallel (FM=00) */
57 EXEC_SEQ
, /* sequential (FM=01) */
58 EXEC_REVSEQ
/* reverse sequential (FM=10) */
62 #define MAX_INSN_FIXUPS (5)
69 bfd_reloc_code_real_type reloc
;
72 typedef struct _fixups
75 struct d30v_fixup fix
[MAX_INSN_FIXUPS
];
79 static Fixups FixUps
[2];
80 static Fixups
*fixups
;
82 /* Whether current and previous instruction are word multiply insns. */
83 static int cur_mul32_p
= 0;
84 static int prev_mul32_p
= 0;
86 /* The flag_explicitly_parallel is true iff the instruction being assembled
87 has been explicitly written as a parallel short-instruction pair by the
88 human programmer. It is used in parallel_ok () to distinguish between
89 those dangerous parallelizations attempted by the human, which are to be
90 allowed, and those attempted by the assembler, which are not. It is set
91 from md_assemble (). */
92 static int flag_explicitly_parallel
= 0;
93 static int flag_xp_state
= 0;
95 /* Whether current and previous left sub-instruction disables
96 execution of right sub-instruction. */
97 static int cur_left_kills_right_p
= 0;
98 static int prev_left_kills_right_p
= 0;
100 /* The known current alignment of the current section. */
101 static int d30v_current_align
;
102 static segT d30v_current_align_seg
;
104 /* The last seen label in the current section. This is used to auto-align
105 labels preceding instructions. */
106 static symbolS
*d30v_last_label
;
109 #define NOP_LEFT ((long long) NOP << 32)
110 #define NOP_RIGHT ((long long) NOP)
111 #define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
113 /* Local functions. */
114 static int reg_name_search
PARAMS ((char *name
));
115 static int register_name
PARAMS ((expressionS
*expressionP
));
116 static int check_range
PARAMS ((unsigned long num
, int bits
, int flags
));
117 static int postfix
PARAMS ((char *p
));
118 static bfd_reloc_code_real_type get_reloc
PARAMS ((struct d30v_operand
*op
, int rel_flag
));
119 static int get_operands
PARAMS ((expressionS exp
[], int cmp_hack
));
120 static struct d30v_format
*find_format
PARAMS ((struct d30v_opcode
*opcode
,
121 expressionS ops
[],int fsize
, int cmp_hack
));
122 static long long build_insn
PARAMS ((struct d30v_insn
*opcode
, expressionS
*opers
));
123 static void write_long
PARAMS ((struct d30v_insn
*opcode
, long long insn
, Fixups
*fx
));
124 static void write_1_short
PARAMS ((struct d30v_insn
*opcode
, long long insn
,
125 Fixups
*fx
, int use_sequential
));
126 static int write_2_short
PARAMS ((struct d30v_insn
*opcode1
, long long insn1
,
127 struct d30v_insn
*opcode2
, long long insn2
, exec_type_enum exec_type
, Fixups
*fx
));
128 static long long do_assemble
PARAMS ((char *str
, struct d30v_insn
*opcode
,
129 int shortp
, int is_parallel
));
130 static int parallel_ok
PARAMS ((struct d30v_insn
*opcode1
, unsigned long insn1
,
131 struct d30v_insn
*opcode2
, unsigned long insn2
,
132 exec_type_enum exec_type
));
133 static void d30v_number_to_chars
PARAMS ((char *buf
, long long value
, int nbytes
));
134 static void check_size
PARAMS ((long value
, int bits
, char *file
, int line
));
135 static void d30v_align
PARAMS ((int, char *, symbolS
*));
136 static void s_d30v_align
PARAMS ((int));
137 static void s_d30v_text
PARAMS ((int));
138 static void s_d30v_data
PARAMS ((int));
139 static void s_d30v_section
PARAMS ((int));
141 struct option md_longopts
[] =
143 {NULL
, no_argument
, NULL
, 0}
146 size_t md_longopts_size
= sizeof (md_longopts
);
148 /* The target specific pseudo-ops which we support. */
149 const pseudo_typeS md_pseudo_table
[] =
152 { "hword", cons
, 2 },
153 { "align", s_d30v_align
, 0 },
154 { "text", s_d30v_text
, 0 },
155 { "data", s_d30v_data
, 0 },
156 { "section", s_d30v_section
, 0 },
157 { "section.s", s_d30v_section
, 0 },
158 { "sect", s_d30v_section
, 0 },
159 { "sect.s", s_d30v_section
, 0 },
163 /* Opcode hash table. */
164 static struct hash_control
*d30v_hash
;
166 /* Do a binary search of the pre_defined_registers array to see if
167 NAME is a valid regiter name. Return the register number from the
168 array on success, or -1 on failure. */
171 reg_name_search (name
)
174 int middle
, low
, high
;
178 high
= reg_name_cnt () - 1;
182 middle
= (low
+ high
) / 2;
183 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
190 if (symbol_find (name
) != NULL
)
192 if (warn_register_name_conflicts
)
193 as_warn (_("Register name %s conflicts with symbol of the same name"),
197 return pre_defined_registers
[middle
].value
;
205 /* Check the string at input_line_pointer to see if it is a valid
209 register_name (expressionP
)
210 expressionS
*expressionP
;
213 char c
, *p
= input_line_pointer
;
215 while (*p
&& *p
!= '\n' && *p
!= '\r' && *p
!= ',' && *p
!= ' ' && *p
!= ')')
222 /* Look to see if it's in the register table. */
223 reg_number
= reg_name_search (input_line_pointer
);
226 expressionP
->X_op
= O_register
;
227 /* Temporarily store a pointer to the string here. */
228 expressionP
->X_op_symbol
= (symbolS
*) input_line_pointer
;
229 expressionP
->X_add_number
= reg_number
;
230 input_line_pointer
= p
;
239 check_range (num
, bits
, flags
)
246 /* Don't bother checking 32-bit values. */
249 if (sizeof (unsigned long) * CHAR_BIT
== 32)
252 /* We don't record signed or unsigned for 32-bit quantities.
254 min
= -((unsigned long) 1 << (bits
- 1));
255 max
= ((unsigned long) 1 << bits
) - 1;
256 return (long) num
< min
|| (long) num
> max
;
259 if (flags
& OPERAND_SHIFT
)
261 /* We know that all shifts are right by three bits. */
264 if (flags
& OPERAND_SIGNED
)
266 unsigned long sign_bit
= ((unsigned long) -1L >> 4) + 1;
267 num
= (num
^ sign_bit
) - sign_bit
;
271 if (flags
& OPERAND_SIGNED
)
273 max
= ((unsigned long) 1 << (bits
- 1)) - 1;
274 min
= - ((unsigned long) 1 << (bits
- 1));
275 return (long) num
> max
|| (long) num
< min
;
279 max
= ((unsigned long) 1 << bits
) - 1;
280 return num
> (unsigned long) max
;
285 md_show_usage (stream
)
288 fprintf (stream
, _("\nD30V options:\n\
289 -O Make adjacent short instructions parallel if possible.\n\
290 -n Warn about all NOPs inserted by the assembler.\n\
291 -N Warn about NOPs inserted after word multiplies.\n\
292 -c Warn about symbols whoes names match register names.\n\
293 -C Opposite of -C. -c is the default.\n"));
297 md_parse_option (c
, arg
)
299 char *arg ATTRIBUTE_UNUSED
;
303 /* Optimize. Will attempt to parallelize operations. */
308 /* Warn about all NOPS that the assembler inserts. */
313 /* Warn about the NOPS that the assembler inserts because of the
316 warn_nops
= NOP_MULTIPLY
;
320 warn_register_name_conflicts
= 1;
324 warn_register_name_conflicts
= 0;
334 md_undefined_symbol (name
)
335 char *name ATTRIBUTE_UNUSED
;
340 /* Turn a string in input_line_pointer into a floating point constant
341 of type TYPE, and store the appropriate bytes in *LITP. The number
342 of LITTLENUMS emitted is stored in *SIZEP. An error message is
343 returned, or NULL on OK. */
346 md_atof (type
, litP
, sizeP
)
352 LITTLENUM_TYPE words
[4];
366 return _("bad call to md_atof");
369 t
= atof_ieee (input_line_pointer
, type
, words
);
371 input_line_pointer
= t
;
375 for (i
= 0; i
< prec
; i
++)
377 md_number_to_chars (litP
, (valueT
) words
[i
], 2);
384 md_convert_frag (abfd
, sec
, fragP
)
385 bfd
*abfd ATTRIBUTE_UNUSED
;
386 asection
*sec ATTRIBUTE_UNUSED
;
387 fragS
*fragP ATTRIBUTE_UNUSED
;
393 md_section_align (seg
, addr
)
397 int align
= bfd_get_section_alignment (stdoutput
, seg
);
398 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
404 struct d30v_opcode
*opcode
;
405 d30v_hash
= hash_new ();
407 /* Insert opcode names into a hash table. */
408 for (opcode
= (struct d30v_opcode
*) d30v_opcode_table
; opcode
->name
; opcode
++)
409 hash_insert (d30v_hash
, opcode
->name
, (char *) opcode
);
412 FixUps
[0].next
= &FixUps
[1];
413 FixUps
[1].next
= &FixUps
[0];
415 d30v_current_align_seg
= now_seg
;
418 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
419 from an expression. */
425 while (*p
!= '-' && *p
!= '+')
427 if (*p
== 0 || *p
== '\n' || *p
== '\r' || *p
== ' ' || *p
== ',')
447 static bfd_reloc_code_real_type
448 get_reloc (op
, rel_flag
)
449 struct d30v_operand
*op
;
455 if (op
->flags
& OPERAND_SHIFT
)
456 return BFD_RELOC_D30V_9_PCREL
;
458 return BFD_RELOC_D30V_6
;
461 if (!(op
->flags
& OPERAND_SHIFT
))
462 as_warn (_("unexpected 12-bit reloc type"));
463 if (rel_flag
== RELOC_PCREL
)
464 return BFD_RELOC_D30V_15_PCREL
;
466 return BFD_RELOC_D30V_15
;
468 if (!(op
->flags
& OPERAND_SHIFT
))
469 as_warn (_("unexpected 18-bit reloc type"));
470 if (rel_flag
== RELOC_PCREL
)
471 return BFD_RELOC_D30V_21_PCREL
;
473 return BFD_RELOC_D30V_21
;
475 if (rel_flag
== RELOC_PCREL
)
476 return BFD_RELOC_D30V_32_PCREL
;
478 return BFD_RELOC_D30V_32
;
484 /* Parse a string of operands and return an array of expressions. */
487 get_operands (exp
, cmp_hack
)
491 char *p
= input_line_pointer
;
497 exp
[numops
].X_op
= O_absent
;
498 exp
[numops
++].X_add_number
= cmp_hack
- 1;
503 while (*p
== ' ' || *p
== '\t' || *p
== ',')
506 if (*p
== 0 || *p
== '\n' || *p
== '\r')
512 exp
[numops
].X_op
= O_absent
;
516 exp
[numops
].X_add_number
= OPERAND_ATPAR
;
522 exp
[numops
].X_add_number
= OPERAND_ATMINUS
;
526 exp
[numops
].X_add_number
= OPERAND_ATSIGN
;
535 /* Just skip the trailing paren. */
540 input_line_pointer
= p
;
542 /* Check to see if it might be a register name. */
543 if (!register_name (&exp
[numops
]))
545 /* Parse as an expression. */
546 expression (&exp
[numops
]);
549 if (exp
[numops
].X_op
== O_illegal
)
550 as_bad (_("illegal operand"));
551 else if (exp
[numops
].X_op
== O_absent
)
552 as_bad (_("missing operand"));
555 p
= input_line_pointer
;
560 /* Postdecrement mode. */
561 exp
[numops
].X_op
= O_absent
;
562 exp
[numops
++].X_add_number
= OPERAND_MINUS
;
565 /* Postincrement mode. */
566 exp
[numops
].X_op
= O_absent
;
567 exp
[numops
++].X_add_number
= OPERAND_PLUS
;
573 exp
[numops
].X_op
= 0;
578 /* Generate the instruction.
579 It does everything but write the FM bits. */
582 build_insn (opcode
, opers
)
583 struct d30v_insn
*opcode
;
586 int i
, length
, bits
, shift
, flags
;
587 unsigned long number
, id
= 0;
589 struct d30v_opcode
*op
= opcode
->op
;
590 struct d30v_format
*form
= opcode
->form
;
593 opcode
->ecc
<< 28 | op
->op1
<< 25 | op
->op2
<< 20 | form
->modifier
<< 18;
595 for (i
= 0; form
->operands
[i
]; i
++)
597 flags
= d30v_operand_table
[form
->operands
[i
]].flags
;
599 /* Must be a register or number. */
600 if (!(flags
& OPERAND_REG
) && !(flags
& OPERAND_NUM
)
601 && !(flags
& OPERAND_NAME
) && !(flags
& OPERAND_SPECIAL
))
604 bits
= d30v_operand_table
[form
->operands
[i
]].bits
;
605 if (flags
& OPERAND_SHIFT
)
608 length
= d30v_operand_table
[form
->operands
[i
]].length
;
609 shift
= 12 - d30v_operand_table
[form
->operands
[i
]].position
;
610 if (opers
[i
].X_op
!= O_symbol
)
611 number
= opers
[i
].X_add_number
;
614 if (flags
& OPERAND_REG
)
616 /* Check for mvfsys or mvtsys control registers. */
617 if (flags
& OPERAND_CONTROL
&& (number
& 0x7f) > MAX_CONTROL_REG
)
620 id
= (number
& 0x7f) - MAX_CONTROL_REG
;
623 else if (number
& OPERAND_FLAG
)
625 /* NUMBER is a flag register. */
630 else if (flags
& OPERAND_SPECIAL
)
635 if (opers
[i
].X_op
!= O_register
&& opers
[i
].X_op
!= O_constant
636 && !(flags
& OPERAND_NAME
))
638 /* Now create a fixup. */
639 if (fixups
->fc
>= MAX_INSN_FIXUPS
)
640 as_fatal (_("too many fixups"));
642 fixups
->fix
[fixups
->fc
].reloc
=
643 get_reloc ((struct d30v_operand
*) &d30v_operand_table
[form
->operands
[i
]], op
->reloc_flag
);
644 fixups
->fix
[fixups
->fc
].size
= 4;
645 fixups
->fix
[fixups
->fc
].exp
= opers
[i
];
646 fixups
->fix
[fixups
->fc
].operand
= form
->operands
[i
];
647 if (fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_D30V_9_PCREL
)
648 fixups
->fix
[fixups
->fc
].pcrel
= RELOC_PCREL
;
650 fixups
->fix
[fixups
->fc
].pcrel
= op
->reloc_flag
;
654 /* Truncate to the proper number of bits. */
655 if ((opers
[i
].X_op
== O_constant
) && check_range (number
, bits
, flags
))
656 as_bad (_("operand out of range: %ld"), number
);
658 number
&= 0x7FFFFFFF >> (31 - bits
);
659 if (flags
& OPERAND_SHIFT
)
663 /* It's a LONG instruction. */
664 insn
|= ((number
& 0xffffffff) >> 26); /* top 6 bits */
665 insn
<<= 32; /* shift the first word over */
666 insn
|= ((number
& 0x03FC0000) << 2); /* next 8 bits */
667 insn
|= number
& 0x0003FFFF; /* bottom 18 bits */
670 insn
|= number
<< shift
;
676 /* Write out a long form instruction. */
679 write_long (opcode
, insn
, fx
)
680 struct d30v_insn
*opcode ATTRIBUTE_UNUSED
;
685 char *f
= frag_more (8);
688 d30v_number_to_chars (f
, insn
, 8);
690 for (i
= 0; i
< fx
->fc
; i
++)
692 if (fx
->fix
[i
].reloc
)
694 where
= f
- frag_now
->fr_literal
;
695 fix_new_exp (frag_now
,
707 /* Write out a short form instruction by itself. */
710 write_1_short (opcode
, insn
, fx
, use_sequential
)
711 struct d30v_insn
*opcode
;
716 char *f
= frag_more (8);
719 if (warn_nops
== NOP_ALL
)
720 as_warn (_("%s NOP inserted"), use_sequential
?
721 _("sequential") : _("parallel"));
723 /* The other container needs to be NOP. */
726 /* Use a sequential NOP rather than a parallel one,
727 as the current instruction is a FLAG_MUL32 type one
728 and the next instruction is a load. */
730 /* According to 4.3.1: for FM=01, sub-instructions performed
731 only by IU cannot be encoded in L-container. */
733 if (opcode
->op
->unit
== IU
)
734 /* Right then left. */
735 insn
|= FM10
| NOP_LEFT
;
737 /* Left then right. */
738 insn
= FM01
| (insn
<< 32) | NOP_RIGHT
;
742 /* According to 4.3.1: for FM=00, sub-instructions performed
743 only by IU cannot be encoded in L-container. */
745 if (opcode
->op
->unit
== IU
)
746 /* Right container. */
747 insn
|= FM00
| NOP_LEFT
;
749 /* Left container. */
750 insn
= FM00
| (insn
<< 32) | NOP_RIGHT
;
753 d30v_number_to_chars (f
, insn
, 8);
755 for (i
= 0; i
< fx
->fc
; i
++)
757 if (fx
->fix
[i
].reloc
)
759 where
= f
- frag_now
->fr_literal
;
760 fix_new_exp (frag_now
,
772 /* Write out a short form instruction if possible.
773 Return number of instructions not written out. */
776 write_2_short (opcode1
, insn1
, opcode2
, insn2
, exec_type
, fx
)
777 struct d30v_insn
*opcode1
, *opcode2
;
778 long long insn1
, insn2
;
779 exec_type_enum exec_type
;
782 long long insn
= NOP2
;
786 if (exec_type
== EXEC_SEQ
787 && (opcode1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
))
788 && ((opcode1
->op
->flags_used
& FLAG_DELAY
) == 0)
789 && ((opcode1
->ecc
== ECC_AL
) || ! Optimizing
))
791 /* Unconditional, non-delayed branches kill instructions in
792 the right bin. Conditional branches don't always but if
793 we are not optimizing, then we have been asked to produce
794 an error about such constructs. For the purposes of this
795 test, subroutine calls are considered to be branches. */
796 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
800 /* Note: we do not have to worry about subroutine calls occurring
801 in the right hand container. The return address is always
802 aligned to the next 64 bit boundary, be that 64 or 32 bit away. */
805 case EXEC_UNKNOWN
: /* Order not specified. */
807 && parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
)
808 && ! ( (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
809 || opcode1
->op
->unit
== MU
)
811 ( opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
812 || opcode2
->op
->unit
== MU
)))
815 exec_type
= EXEC_PARALLEL
;
817 if (opcode1
->op
->unit
== IU
818 || opcode2
->op
->unit
== MU
819 || opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
820 insn
= FM00
| (insn2
<< 32) | insn1
;
823 insn
= FM00
| (insn1
<< 32) | insn2
;
827 else if ((opcode1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
)
828 && ((opcode1
->op
->flags_used
& FLAG_DELAY
) == 0))
829 || opcode1
->op
->flags_used
& FLAG_RP
)
831 /* We must emit (non-delayed) branch type instructions
832 on their own with nothing in the right container. */
833 /* We must treat repeat instructions likewise, since the
834 following instruction has to be separate from the repeat
835 in order to be repeated. */
836 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
839 else if (prev_left_kills_right_p
)
841 /* The left instruction kils the right slot, so we
842 must leave it empty. */
843 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
846 else if (opcode1
->op
->unit
== IU
)
848 if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
850 /* Case 103810 is a request from Mitsubishi that opcodes
851 with EITHER_BUT_PREFER_MU should not be executed in
852 reverse sequential order. */
853 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
857 /* Reverse sequential. */
858 insn
= FM10
| (insn2
<< 32) | insn1
;
859 exec_type
= EXEC_REVSEQ
;
864 insn
= FM01
| (insn1
<< 32) | insn2
;
866 exec_type
= EXEC_SEQ
;
870 case EXEC_PARALLEL
: /* Parallel. */
871 flag_explicitly_parallel
= flag_xp_state
;
872 if (! parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
))
873 as_bad (_("Instructions may not be executed in parallel"));
874 else if (opcode1
->op
->unit
== IU
)
876 if (opcode2
->op
->unit
== IU
)
877 as_bad (_("Two IU instructions may not be executed in parallel"));
878 as_warn (_("Swapping instruction order"));
879 insn
= FM00
| (insn2
<< 32) | insn1
;
881 else if (opcode2
->op
->unit
== MU
)
883 if (opcode1
->op
->unit
== MU
)
884 as_bad (_("Two MU instructions may not be executed in parallel"));
885 else if (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
)
886 as_warn (_("Executing %s in IU may not work"), opcode1
->op
->name
);
887 as_warn (_("Swapping instruction order"));
888 insn
= FM00
| (insn2
<< 32) | insn1
;
892 if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
893 as_warn (_("Executing %s in IU may not work in parallel execution"),
896 insn
= FM00
| (insn1
<< 32) | insn2
;
899 flag_explicitly_parallel
= 0;
902 case EXEC_SEQ
: /* Sequential. */
903 if (opcode1
->op
->unit
== IU
)
904 as_bad (_("IU instruction may not be in the left container"));
905 if (prev_left_kills_right_p
)
906 as_bad (_("special left instruction `%s' kills instruction "
907 "`%s' in right container"),
908 opcode1
->op
->name
, opcode2
->op
->name
);
909 insn
= FM01
| (insn1
<< 32) | insn2
;
913 case EXEC_REVSEQ
: /* Reverse sequential. */
914 if (opcode2
->op
->unit
== MU
)
915 as_bad (_("MU instruction may not be in the right container"));
916 if (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
)
917 as_warn (_("Executing %s in reverse serial with %s may not work"),
918 opcode1
->op
->name
, opcode2
->op
->name
);
919 else if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
920 as_warn (_("Executing %s in IU in reverse serial may not work"),
922 insn
= FM10
| (insn1
<< 32) | insn2
;
927 as_fatal (_("unknown execution type passed to write_2_short()"));
931 d30v_number_to_chars (f
, insn
, 8);
933 /* If the previous instruction was a 32-bit multiply but it is put into a
934 parallel container, mark the current instruction as being a 32-bit
936 if (prev_mul32_p
&& exec_type
== EXEC_PARALLEL
)
939 for (j
= 0; j
< 2; j
++)
941 for (i
= 0; i
< fx
->fc
; i
++)
943 if (fx
->fix
[i
].reloc
)
945 where
= (f
- frag_now
->fr_literal
) + 4 * j
;
947 fix_new_exp (frag_now
,
963 /* Check 2 instructions and determine if they can be safely
964 executed in parallel. Return 1 if they can be. */
967 parallel_ok (op1
, insn1
, op2
, insn2
, exec_type
)
968 struct d30v_insn
*op1
, *op2
;
969 unsigned long insn1
, insn2
;
970 exec_type_enum exec_type
;
972 int i
, j
, shift
, regno
, bits
, ecc
;
973 unsigned long flags
, mask
, flags_set1
, flags_set2
, flags_used1
, flags_used2
;
974 unsigned long ins
, mod_reg
[2][3], used_reg
[2][3], flag_reg
[2];
975 struct d30v_format
*f
;
976 struct d30v_opcode
*op
;
978 /* Section 4.3: Both instructions must not be IU or MU only. */
979 if ((op1
->op
->unit
== IU
&& op2
->op
->unit
== IU
)
980 || (op1
->op
->unit
== MU
&& op2
->op
->unit
== MU
))
983 /* First instruction must not be a jump to safely optimize, unless this
984 is an explicit parallel operation. */
985 if (exec_type
!= EXEC_PARALLEL
986 && (op1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
)))
989 /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
990 then it is safe to allow the two to be done as parallel ops, since only
991 one will ever be executed at a time. */
992 if ((op1
->ecc
== ECC_TX
&& op2
->ecc
== ECC_FX
)
993 || (op1
->ecc
== ECC_FX
&& op2
->ecc
== ECC_TX
)
994 || (op1
->ecc
== ECC_XT
&& op2
->ecc
== ECC_XF
)
995 || (op1
->ecc
== ECC_XF
&& op2
->ecc
== ECC_XT
))
1000 [2] a0, a1, flag registers. */
1001 for (j
= 0; j
< 2; j
++)
1019 mod_reg
[j
][0] = mod_reg
[j
][1] = 0;
1020 used_reg
[j
][0] = used_reg
[j
][1] = 0;
1022 if (flag_explicitly_parallel
)
1024 /* For human specified parallel instructions we have been asked
1025 to ignore the possibility that both instructions could modify
1026 bits in the PSW, so we initialise the mod & used arrays to 0.
1027 We have been asked, however, to refuse to allow parallel
1028 instructions which explicitly set the same flag register,
1029 eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
1030 for the use of a flag register and set a bit in the mod or used
1031 array appropriately. */
1037 mod_reg
[j
][2] = (op
->flags_set
& FLAG_ALL
);
1038 used_reg
[j
][2] = (op
->flags_used
& FLAG_ALL
);
1041 /* BSR/JSR always sets R62. */
1042 if (op
->flags_used
& FLAG_JSR
)
1043 mod_reg
[j
][1] = (1L << (62 - 32));
1045 /* Conditional execution affects the flags_used. */
1050 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_0
;
1055 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_1
;
1060 used_reg
[j
][2] |= flag_reg
[j
] = (FLAG_0
| FLAG_1
);
1064 for (i
= 0; f
->operands
[i
]; i
++)
1066 flags
= d30v_operand_table
[f
->operands
[i
]].flags
;
1067 shift
= 12 - d30v_operand_table
[f
->operands
[i
]].position
;
1068 bits
= d30v_operand_table
[f
->operands
[i
]].bits
;
1072 mask
= 0x7FFFFFFF >> (31 - bits
);
1074 if ((flags
& OPERAND_PLUS
) || (flags
& OPERAND_MINUS
))
1076 /* This is a post-increment or post-decrement.
1077 The previous register needs to be marked as modified. */
1078 shift
= 12 - d30v_operand_table
[f
->operands
[i
- 1]].position
;
1079 regno
= (ins
>> shift
) & 0x3f;
1081 mod_reg
[j
][1] |= 1L << (regno
- 32);
1083 mod_reg
[j
][0] |= 1L << regno
;
1085 else if (flags
& OPERAND_REG
)
1087 regno
= (ins
>> shift
) & mask
;
1088 /* The memory write functions don't have a destination
1090 if ((flags
& OPERAND_DEST
) && !(op
->flags_set
& FLAG_MEM
))
1092 /* MODIFIED registers and flags. */
1093 if (flags
& OPERAND_ACC
)
1096 mod_reg
[j
][2] |= FLAG_A0
;
1097 else if (regno
== 1)
1098 mod_reg
[j
][2] |= FLAG_A1
;
1102 else if (flags
& OPERAND_FLAG
)
1103 mod_reg
[j
][2] |= 1L << regno
;
1104 else if (!(flags
& OPERAND_CONTROL
))
1108 /* Need to check if there are two destination
1109 registers, for example ld2w. */
1110 if (flags
& OPERAND_2REG
)
1115 for (r
= regno
; r
<= regno
+ z
; r
++)
1118 mod_reg
[j
][1] |= 1L << (r
- 32);
1120 mod_reg
[j
][0] |= 1L << r
;
1126 /* USED, but not modified registers and flags. */
1127 if (flags
& OPERAND_ACC
)
1130 used_reg
[j
][2] |= FLAG_A0
;
1131 else if (regno
== 1)
1132 used_reg
[j
][2] |= FLAG_A1
;
1136 else if (flags
& OPERAND_FLAG
)
1137 used_reg
[j
][2] |= 1L << regno
;
1138 else if (!(flags
& OPERAND_CONTROL
))
1142 /* Need to check if there are two source
1143 registers, for example st2w. */
1144 if (flags
& OPERAND_2REG
)
1149 for (r
= regno
; r
<= regno
+ z
; r
++)
1152 used_reg
[j
][1] |= 1L << (r
- 32);
1154 used_reg
[j
][0] |= 1L << r
;
1162 flags_set1
= op1
->op
->flags_set
;
1163 flags_set2
= op2
->op
->flags_set
;
1164 flags_used1
= op1
->op
->flags_used
;
1165 flags_used2
= op2
->op
->flags_used
;
1167 /* Check for illegal combinations with ADDppp/SUBppp. */
1168 if (((flags_set1
& FLAG_NOT_WITH_ADDSUBppp
) != 0
1169 && (flags_used2
& FLAG_ADDSUBppp
) != 0)
1170 || ((flags_set2
& FLAG_NOT_WITH_ADDSUBppp
) != 0
1171 && (flags_used1
& FLAG_ADDSUBppp
) != 0))
1174 /* Load instruction combined with half-word multiply is illegal. */
1175 if (((flags_used1
& FLAG_MEM
) != 0 && (flags_used2
& FLAG_MUL16
))
1176 || ((flags_used2
& FLAG_MEM
) != 0 && (flags_used1
& FLAG_MUL16
)))
1179 /* Specifically allow add || add by removing carry, overflow bits dependency.
1180 This is safe, even if an addc follows since the IU takes the argument in
1181 the right container, and it writes its results last.
1182 However, don't paralellize add followed by addc or sub followed by
1184 if (mod_reg
[0][2] == FLAG_CVVA
&& mod_reg
[1][2] == FLAG_CVVA
1185 && (used_reg
[0][2] & ~flag_reg
[0]) == 0
1186 && (used_reg
[1][2] & ~flag_reg
[1]) == 0
1187 && op1
->op
->unit
== EITHER
&& op2
->op
->unit
== EITHER
)
1189 mod_reg
[0][2] = mod_reg
[1][2] = 0;
1192 for (j
= 0; j
< 3; j
++)
1194 /* If the second instruction depends on the first, we obviously
1195 cannot parallelize. Note, the mod flag implies use, so
1196 check that as well. */
1197 /* If flag_explicitly_parallel is set, then the case of the
1198 second instruction using a register the first instruction
1199 modifies is assumed to be okay; we trust the human. We
1200 don't trust the human if both instructions modify the same
1201 register but we do trust the human if they modify the same
1203 /* We have now been requested not to trust the human if the
1204 instructions modify the same flag registers either. */
1205 if (flag_explicitly_parallel
)
1207 if ((mod_reg
[0][j
] & mod_reg
[1][j
]) != 0)
1211 if ((mod_reg
[0][j
] & (mod_reg
[1][j
] | used_reg
[1][j
])) != 0)
1218 /* This is the main entry point for the machine-dependent assembler.
1219 STR points to a machine-dependent instruction. This function is
1220 supposed to emit the frags/bytes it assembles to. For the D30V, it
1221 mostly handles the special VLIW parsing and packing and leaves the
1222 difficult stuff to do_assemble (). */
1224 static long long prev_insn
= -1;
1225 static struct d30v_insn prev_opcode
;
1226 static subsegT prev_subseg
;
1227 static segT prev_seg
= 0;
1233 struct d30v_insn opcode
;
1235 /* Execution type; parallel, etc. */
1236 exec_type_enum extype
= EXEC_UNKNOWN
;
1237 /* Saved extype. Used for multiline instructions. */
1238 static exec_type_enum etype
= EXEC_UNKNOWN
;
1241 if ((prev_insn
!= -1) && prev_seg
1242 && ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1243 d30v_cleanup (FALSE
);
1245 if (d30v_current_align
< 3)
1246 d30v_align (3, NULL
, d30v_last_label
);
1247 else if (d30v_current_align
> 3)
1248 d30v_current_align
= 3;
1249 d30v_last_label
= NULL
;
1251 flag_explicitly_parallel
= 0;
1253 if (etype
== EXEC_UNKNOWN
)
1255 /* Look for the special multiple instruction separators. */
1256 str2
= strstr (str
, "||");
1259 extype
= EXEC_PARALLEL
;
1264 str2
= strstr (str
, "->");
1269 str2
= strstr (str
, "<-");
1271 extype
= EXEC_REVSEQ
;
1275 /* STR2 points to the separator, if one. */
1280 /* If two instructions are present and we already have one saved,
1281 then first write it out. */
1282 d30v_cleanup (FALSE
);
1284 /* Assemble first instruction and save it. */
1285 prev_insn
= do_assemble (str
, &prev_opcode
, 1, 0);
1286 if (prev_insn
== -1)
1287 as_bad (_("Cannot assemble instruction"));
1288 if (prev_opcode
.form
!= NULL
&& prev_opcode
.form
->form
>= LONG
)
1289 as_bad (_("First opcode is long. Unable to mix instructions as specified."));
1290 fixups
= fixups
->next
;
1293 prev_subseg
= now_subseg
;
1297 insn
= do_assemble (str
, &opcode
,
1298 (extype
!= EXEC_UNKNOWN
|| etype
!= EXEC_UNKNOWN
),
1299 extype
== EXEC_PARALLEL
);
1302 if (extype
!= EXEC_UNKNOWN
)
1304 as_bad (_("Cannot assemble instruction"));
1308 if (etype
!= EXEC_UNKNOWN
)
1311 etype
= EXEC_UNKNOWN
;
1314 /* Word multiply instructions must not be followed by either a load or a
1315 16-bit multiply instruction in the next cycle. */
1316 if ( (extype
!= EXEC_REVSEQ
)
1318 && (opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1320 /* However, load and multiply should able to be combined in a parallel
1321 operation, so check for that first. */
1323 && (opcode
.op
->flags_used
& FLAG_MEM
)
1324 && opcode
.form
->form
< LONG
1325 && (extype
== EXEC_PARALLEL
|| (Optimizing
&& extype
== EXEC_UNKNOWN
))
1326 && parallel_ok (&prev_opcode
, (long) prev_insn
,
1327 &opcode
, (long) insn
, extype
)
1328 && write_2_short (&prev_opcode
, (long) prev_insn
,
1329 &opcode
, (long) insn
, extype
, fixups
) == 0)
1331 /* No instructions saved. */
1337 /* Can't parallelize, flush previous instruction and emit a
1338 word of NOPS, unless the previous instruction is a NOP,
1339 in which case just flush it, as this will generate a word
1342 if (prev_insn
!= -1 && (strcmp (prev_opcode
.op
->name
, "nop") == 0))
1343 d30v_cleanup (FALSE
);
1348 if (prev_insn
!= -1)
1349 d30v_cleanup (TRUE
);
1353 d30v_number_to_chars (f
, NOP2
, 8);
1355 if (warn_nops
== NOP_ALL
|| warn_nops
== NOP_MULTIPLY
)
1357 if (opcode
.op
->flags_used
& FLAG_MEM
)
1358 as_warn (_("word of NOPs added between word multiply and load"));
1360 as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1365 extype
= EXEC_UNKNOWN
;
1368 else if ( (extype
== EXEC_REVSEQ
)
1370 && (prev_opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1372 /* Can't parallelize, flush current instruction and add a
1374 write_1_short (&opcode
, (long) insn
, fixups
->next
->next
, TRUE
);
1376 /* Make the previous instruction the current one. */
1377 extype
= EXEC_UNKNOWN
;
1380 now_subseg
= prev_subseg
;
1382 cur_mul32_p
= prev_mul32_p
;
1384 memcpy (&opcode
, &prev_opcode
, sizeof (prev_opcode
));
1387 /* If this is a long instruction, write it and any previous short
1389 if (opcode
.form
->form
>= LONG
)
1391 if (extype
!= EXEC_UNKNOWN
)
1392 as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1393 d30v_cleanup (FALSE
);
1394 write_long (&opcode
, insn
, fixups
);
1397 else if ((prev_insn
!= -1)
1399 (&prev_opcode
, (long) prev_insn
, &opcode
,
1400 (long) insn
, extype
, fixups
) == 0))
1402 /* No instructions saved. */
1407 if (extype
!= EXEC_UNKNOWN
)
1408 as_bad (_("Unable to mix instructions as specified"));
1410 /* Save off last instruction so it may be packed on next pass. */
1411 memcpy (&prev_opcode
, &opcode
, sizeof (prev_opcode
));
1414 prev_subseg
= now_subseg
;
1415 fixups
= fixups
->next
;
1416 prev_mul32_p
= cur_mul32_p
;
1420 /* Assemble a single instruction and return an opcode.
1421 Return -1 (an invalid opcode) on error. */
1423 #define NAME_BUF_LEN 20
1426 do_assemble (str
, opcode
, shortp
, is_parallel
)
1428 struct d30v_insn
*opcode
;
1435 char name
[NAME_BUF_LEN
];
1438 int fsize
= (shortp
? FORCE_SHORT
: 0);
1439 expressionS myops
[6];
1442 /* Drop leading whitespace. */
1446 /* Find the opcode end. */
1447 for (op_start
= op_end
= str
;
1449 && nlen
< (NAME_BUF_LEN
- 1)
1451 && !is_end_of_line
[(unsigned char) *op_end
] && *op_end
!= ' ';
1454 name
[nlen
] = TOLOWER (op_start
[nlen
]);
1463 /* If there is an execution condition code, handle it. */
1467 while ((i
< ECC_MAX
) && strncasecmp (d30v_ecc_names
[i
], op_end
+ 1, 2))
1473 strncpy (tmp
, op_end
+ 1, 2);
1475 as_bad (_("unknown condition code: %s"), tmp
);
1482 opcode
->ecc
= ECC_AL
;
1484 /* CMP and CMPU change their name based on condition codes. */
1485 if (!strncmp (name
, "cmp", 3))
1488 char **str
= (char **) d30v_cc_names
;
1494 for (i
= 1; *str
&& strncmp (*str
, &name
[p
], 2); i
++, str
++)
1497 /* cmpu only supports some condition codes. */
1503 as_bad (_("cmpu doesn't support condition code %s"), &name
[p
]);
1510 as_bad (_("unknown condition code: %s"), &name
[p
]);
1519 /* Need to look for .s or .l. */
1520 if (name
[nlen
- 2] == '.')
1522 switch (name
[nlen
- 1])
1525 fsize
= FORCE_SHORT
;
1534 /* Find the first opcode with the proper name. */
1535 opcode
->op
= (struct d30v_opcode
*) hash_find (d30v_hash
, name
);
1536 if (opcode
->op
== NULL
)
1538 as_bad (_("unknown opcode: %s"), name
);
1542 save
= input_line_pointer
;
1543 input_line_pointer
= op_end
;
1544 while (!(opcode
->form
= find_format (opcode
->op
, myops
, fsize
, cmp_hack
)))
1547 if (opcode
->op
->name
== NULL
|| strcmp (opcode
->op
->name
, name
))
1549 as_bad (_("operands for opcode `%s' do not match any valid format"),
1554 input_line_pointer
= save
;
1556 insn
= build_insn (opcode
, myops
);
1558 /* Propagate multiply status. */
1561 if (is_parallel
&& prev_mul32_p
)
1565 prev_mul32_p
= cur_mul32_p
;
1566 cur_mul32_p
= (opcode
->op
->flags_used
& FLAG_MUL32
) != 0;
1570 /* Propagate left_kills_right status. */
1573 prev_left_kills_right_p
= cur_left_kills_right_p
;
1575 if (opcode
->op
->flags_set
& FLAG_LKR
)
1577 cur_left_kills_right_p
= 1;
1579 if (strcmp (opcode
->op
->name
, "mvtsys") == 0)
1581 /* Left kills right for only mvtsys only for
1582 PSW/PSWH/PSWL/flags target. */
1583 if ((myops
[0].X_op
== O_register
) &&
1584 ((myops
[0].X_add_number
== OPERAND_CONTROL
) || /* psw */
1585 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+2) || /* pswh */
1586 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+1) || /* pswl */
1587 (myops
[0].X_add_number
== OPERAND_FLAG
+0) || /* f0 */
1588 (myops
[0].X_add_number
== OPERAND_FLAG
+1) || /* f1 */
1589 (myops
[0].X_add_number
== OPERAND_FLAG
+2) || /* f2 */
1590 (myops
[0].X_add_number
== OPERAND_FLAG
+3) || /* f3 */
1591 (myops
[0].X_add_number
== OPERAND_FLAG
+4) || /* f4 */
1592 (myops
[0].X_add_number
== OPERAND_FLAG
+5) || /* f5 */
1593 (myops
[0].X_add_number
== OPERAND_FLAG
+6) || /* f6 */
1594 (myops
[0].X_add_number
== OPERAND_FLAG
+7))) /* f7 */
1596 cur_left_kills_right_p
= 1;
1600 /* Other mvtsys target registers don't kill right
1602 cur_left_kills_right_p
= 0;
1607 cur_left_kills_right_p
= 0;
1613 /* Get a pointer to an entry in the format table.
1614 It must look at all formats for an opcode and use the operands
1615 to choose the correct one. Return NULL on error. */
1617 static struct d30v_format
*
1618 find_format (opcode
, myops
, fsize
, cmp_hack
)
1619 struct d30v_opcode
*opcode
;
1620 expressionS myops
[];
1624 int numops
, match
, index
, i
= 0, j
, k
;
1625 struct d30v_format
*fm
;
1630 /* Get all the operands and save them as expressions. */
1631 numops
= get_operands (myops
, cmp_hack
);
1633 while ((index
= opcode
->format
[i
++]) != 0)
1635 if (fsize
== FORCE_SHORT
&& index
>= LONG
)
1638 if (fsize
== FORCE_LONG
&& index
< LONG
)
1641 fm
= (struct d30v_format
*) &d30v_format_table
[index
];
1643 while (fm
->form
== index
)
1646 /* Now check the operands for compatibility. */
1647 for (j
= 0; match
&& fm
->operands
[j
]; j
++)
1649 int flags
= d30v_operand_table
[fm
->operands
[j
]].flags
;
1650 int bits
= d30v_operand_table
[fm
->operands
[j
]].bits
;
1651 int X_op
= myops
[j
].X_op
;
1652 int num
= myops
[j
].X_add_number
;
1654 if (flags
& OPERAND_SPECIAL
)
1656 else if (X_op
== O_illegal
)
1658 else if (flags
& OPERAND_REG
)
1660 if (X_op
!= O_register
1661 || ((flags
& OPERAND_ACC
) && !(num
& OPERAND_ACC
))
1662 || (!(flags
& OPERAND_ACC
) && (num
& OPERAND_ACC
))
1663 || ((flags
& OPERAND_FLAG
) && !(num
& OPERAND_FLAG
))
1664 || (!(flags
& (OPERAND_FLAG
| OPERAND_CONTROL
)) && (num
& OPERAND_FLAG
))
1665 || ((flags
& OPERAND_CONTROL
)
1666 && !(num
& (OPERAND_CONTROL
| OPERAND_FLAG
))))
1671 else if (((flags
& OPERAND_MINUS
)
1672 && (X_op
!= O_absent
|| num
!= OPERAND_MINUS
))
1673 || ((flags
& OPERAND_PLUS
)
1674 && (X_op
!= O_absent
|| num
!= OPERAND_PLUS
))
1675 || ((flags
& OPERAND_ATMINUS
)
1676 && (X_op
!= O_absent
|| num
!= OPERAND_ATMINUS
))
1677 || ((flags
& OPERAND_ATPAR
)
1678 && (X_op
!= O_absent
|| num
!= OPERAND_ATPAR
))
1679 || ((flags
& OPERAND_ATSIGN
)
1680 && (X_op
!= O_absent
|| num
!= OPERAND_ATSIGN
)))
1684 else if (flags
& OPERAND_NUM
)
1686 /* A number can be a constant or symbol expression. */
1688 /* If we have found a register name, but that name
1689 also matches a symbol, then re-parse the name as
1691 if (X_op
== O_register
1692 && symbol_find ((char *) myops
[j
].X_op_symbol
))
1694 input_line_pointer
= (char *) myops
[j
].X_op_symbol
;
1695 expression (&myops
[j
]);
1698 /* Turn an expression into a symbol for later resolution. */
1699 if (X_op
!= O_absent
&& X_op
!= O_constant
1700 && X_op
!= O_symbol
&& X_op
!= O_register
1703 symbolS
*sym
= make_expr_symbol (&myops
[j
]);
1704 myops
[j
].X_op
= X_op
= O_symbol
;
1705 myops
[j
].X_add_symbol
= sym
;
1706 myops
[j
].X_add_number
= num
= 0;
1709 if (fm
->form
>= LONG
)
1711 /* If we're testing for a LONG format, either fits. */
1712 if (X_op
!= O_constant
&& X_op
!= O_symbol
)
1715 else if (fm
->form
< LONG
1716 && ((fsize
== FORCE_SHORT
&& X_op
== O_symbol
)
1717 || (fm
->form
== SHORT_D2
&& j
== 0)))
1720 /* This is the tricky part. Will the constant or symbol
1721 fit into the space in the current format? */
1722 else if (X_op
== O_constant
)
1724 if (check_range (num
, bits
, flags
))
1727 else if (X_op
== O_symbol
1728 && S_IS_DEFINED (myops
[j
].X_add_symbol
)
1729 && S_GET_SEGMENT (myops
[j
].X_add_symbol
) == now_seg
1730 && opcode
->reloc_flag
== RELOC_PCREL
)
1732 /* If the symbol is defined, see if the value will fit
1733 into the form we're considering. */
1737 /* Calculate the current address by running through the
1738 previous frags and adding our current offset. */
1740 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1741 value
+= f
->fr_fix
+ f
->fr_offset
;
1742 value
= (S_GET_VALUE (myops
[j
].X_add_symbol
) - value
1743 - (obstack_next_free (&frchain_now
->frch_obstack
)
1744 - frag_now
->fr_literal
));
1745 if (check_range (value
, bits
, flags
))
1752 /* We're only done if the operands matched so far AND there
1753 are no more to check. */
1754 if (match
&& myops
[j
].X_op
== 0)
1756 /* Final check - issue a warning if an odd numbered register
1757 is used as the first register in an instruction that reads
1758 or writes 2 registers. */
1760 for (j
= 0; fm
->operands
[j
]; j
++)
1761 if (myops
[j
].X_op
== O_register
1762 && (myops
[j
].X_add_number
& 1)
1763 && (d30v_operand_table
[fm
->operands
[j
]].flags
& OPERAND_2REG
))
1764 as_warn (_("Odd numbered register used as target of multi-register instruction"));
1768 fm
= (struct d30v_format
*) &d30v_format_table
[++k
];
1774 /* If while processing a fixup, a reloc really needs to be created,
1775 then it is done here. */
1778 tc_gen_reloc (seg
, fixp
)
1779 asection
*seg ATTRIBUTE_UNUSED
;
1783 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1784 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1785 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1786 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1787 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1788 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1790 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1791 _("reloc %d not supported by object file format"),
1792 (int) fixp
->fx_r_type
);
1801 md_estimate_size_before_relax (fragp
, seg
)
1802 fragS
*fragp ATTRIBUTE_UNUSED
;
1803 asection
*seg ATTRIBUTE_UNUSED
;
1810 md_pcrel_from_section (fixp
, sec
)
1814 if (fixp
->fx_addsy
!= (symbolS
*) NULL
1815 && (!S_IS_DEFINED (fixp
->fx_addsy
)
1816 || (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1818 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1822 md_apply_fix3 (fixP
, valP
, seg
)
1825 segT seg ATTRIBUTE_UNUSED
;
1828 unsigned long insn
, insn2
;
1831 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1834 /* We don't support subtracting a symbol. */
1835 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1836 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1838 /* Fetch the instruction, insert the fully resolved operand
1839 value, and stuff the instruction back again. */
1840 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1841 insn
= bfd_getb32 ((unsigned char *) where
);
1843 switch (fixP
->fx_r_type
)
1845 case BFD_RELOC_8
: /* Check for a bad .byte directive. */
1846 if (fixP
->fx_addsy
!= NULL
)
1847 as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1848 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1849 else if (((unsigned)value
) > 0xff)
1850 as_bad (_("line %d: unable to place value %lx into a byte"),
1851 fixP
->fx_line
, value
);
1853 *(unsigned char *) where
= value
;
1856 case BFD_RELOC_16
: /* Check for a bad .short directive. */
1857 if (fixP
->fx_addsy
!= NULL
)
1858 as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1859 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1860 else if (((unsigned)value
) > 0xffff)
1861 as_bad (_("line %d: unable to place value %lx into a short"),
1862 fixP
->fx_line
, value
);
1864 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1867 case BFD_RELOC_64
: /* Check for a bad .quad directive. */
1868 if (fixP
->fx_addsy
!= NULL
)
1869 as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1870 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1873 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1874 bfd_putb32 (0, ((unsigned char *) where
) + 4);
1878 case BFD_RELOC_D30V_6
:
1879 check_size (value
, 6, fixP
->fx_file
, fixP
->fx_line
);
1880 insn
|= value
& 0x3F;
1881 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1884 case BFD_RELOC_D30V_9_PCREL
:
1885 if (fixP
->fx_where
& 0x7)
1890 fixP
->fx_r_type
= BFD_RELOC_D30V_9_PCREL_R
;
1892 check_size (value
, 9, fixP
->fx_file
, fixP
->fx_line
);
1893 insn
|= ((value
>> 3) & 0x3F) << 12;
1894 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1897 case BFD_RELOC_D30V_15
:
1898 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
1899 insn
|= (value
>> 3) & 0xFFF;
1900 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1903 case BFD_RELOC_D30V_15_PCREL
:
1904 if (fixP
->fx_where
& 0x7)
1909 fixP
->fx_r_type
= BFD_RELOC_D30V_15_PCREL_R
;
1911 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
1912 insn
|= (value
>> 3) & 0xFFF;
1913 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1916 case BFD_RELOC_D30V_21
:
1917 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
1918 insn
|= (value
>> 3) & 0x3FFFF;
1919 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1922 case BFD_RELOC_D30V_21_PCREL
:
1923 if (fixP
->fx_where
& 0x7)
1928 fixP
->fx_r_type
= BFD_RELOC_D30V_21_PCREL_R
;
1930 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
1931 insn
|= (value
>> 3) & 0x3FFFF;
1932 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1935 case BFD_RELOC_D30V_32
:
1936 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
1937 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
1938 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
1939 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
1940 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1941 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
1944 case BFD_RELOC_D30V_32_PCREL
:
1945 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
1946 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
1947 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
1948 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
1949 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1950 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
1954 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1958 as_bad (_("line %d: unknown relocation type: 0x%x"),
1959 fixP
->fx_line
, fixP
->fx_r_type
);
1963 /* Called after the assembler has finished parsing the input file or
1964 after a label is defined. Because the D30V assembler sometimes
1965 saves short instructions to see if it can package them with the
1966 next instruction, there may be a short instruction that still needs
1970 d30v_cleanup (use_sequential
)
1976 if (prev_insn
!= -1)
1979 subseg
= now_subseg
;
1980 subseg_set (prev_seg
, prev_subseg
);
1981 write_1_short (&prev_opcode
, (long) prev_insn
, fixups
->next
,
1983 subseg_set (seg
, subseg
);
1986 prev_mul32_p
= FALSE
;
1993 d30v_number_to_chars (buf
, value
, n
)
1994 char *buf
; /* Return 'nbytes' of chars here. */
1995 long long value
; /* The value of the bits. */
1996 int n
; /* Number of bytes in the output. */
2000 buf
[n
] = value
& 0xff;
2005 /* This function is called at the start of every line. It checks to
2006 see if the first character is a '.', which indicates the start of a
2007 pseudo-op. If it is, then write out any unwritten instructions. */
2012 char *c
= input_line_pointer
;
2014 while (ISSPACE (*c
))
2018 d30v_cleanup (FALSE
);
2022 check_size (value
, bits
, file
, line
)
2035 max
= (1 << (bits
- 1)) - 1;
2038 as_bad_where (file
, line
, _("value too large to fit in %d bits"), bits
);
2041 /* d30v_frob_label() is called when after a label is recognized. */
2044 d30v_frob_label (lab
)
2047 /* Emit any pending instructions. */
2048 d30v_cleanup (FALSE
);
2050 /* Update the label's address with the current output pointer. */
2051 symbol_set_frag (lab
, frag_now
);
2052 S_SET_VALUE (lab
, (valueT
) frag_now_fix ());
2054 /* Record this label for future adjustment after we find out what
2055 kind of data it references, and the required alignment therewith. */
2056 d30v_last_label
= lab
;
2059 /* Hook into cons for capturing alignment changes. */
2062 d30v_cons_align (size
)
2068 while ((size
>>= 1) != 0)
2071 if (d30v_current_align
< log_size
)
2072 d30v_align (log_size
, (char *) NULL
, NULL
);
2073 else if (d30v_current_align
> log_size
)
2074 d30v_current_align
= log_size
;
2075 d30v_last_label
= NULL
;
2078 /* Called internally to handle all alignment needs. This takes care
2079 of eliding calls to frag_align if'n the cached current alignment
2080 says we've already got it, as well as taking care of the auto-aligning
2084 d30v_align (n
, pfill
, label
)
2089 /* The front end is prone to changing segments out from under us
2090 temporarily when -g is in effect. */
2091 int switched_seg_p
= (d30v_current_align_seg
!= now_seg
);
2093 /* Do not assume that if 'd30v_current_align >= n' and
2094 '! switched_seg_p' that it is safe to avoid performing
2095 this alignment request. The alignment of the current frag
2096 can be changed under our feet, for example by a .ascii
2097 directive in the source code. cf testsuite/gas/d30v/reloc.s */
2098 d30v_cleanup (FALSE
);
2103 && (bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
) != 0)
2105 static char const nop
[4] = { 0x00, 0xf0, 0x00, 0x00 };
2107 /* First, make sure we're on a four-byte boundary, in case
2108 someone has been putting .byte values the text section. */
2109 if (d30v_current_align
< 2 || switched_seg_p
)
2110 frag_align (2, 0, 0);
2111 frag_align_pattern (n
, nop
, sizeof nop
, 0);
2114 frag_align (n
, 0, 0);
2117 frag_align (n
, *pfill
, 0);
2119 if (!switched_seg_p
)
2120 d30v_current_align
= n
;
2125 int label_seen
= FALSE
;
2126 struct frag
*old_frag
;
2130 assert (S_GET_SEGMENT (label
) == now_seg
);
2132 old_frag
= symbol_get_frag (label
);
2133 old_value
= S_GET_VALUE (label
);
2134 new_value
= (valueT
) frag_now_fix ();
2136 /* It is possible to have more than one label at a particular
2137 address, especially if debugging is enabled, so we must
2138 take care to adjust all the labels at this address in this
2139 fragment. To save time we search from the end of the symbol
2140 list, backwards, since the symbols we are interested in are
2141 almost certainly the ones that were most recently added.
2142 Also to save time we stop searching once we have seen at least
2143 one matching label, and we encounter a label that is no longer
2144 in the target fragment. Note, this search is guaranteed to
2145 find at least one match when sym == label, so no special case
2146 code is necessary. */
2147 for (sym
= symbol_lastP
; sym
!= NULL
; sym
= symbol_previous (sym
))
2149 if (symbol_get_frag (sym
) == old_frag
2150 && S_GET_VALUE (sym
) == old_value
)
2153 symbol_set_frag (sym
, frag_now
);
2154 S_SET_VALUE (sym
, new_value
);
2156 else if (label_seen
&& symbol_get_frag (sym
) != old_frag
)
2161 record_alignment (now_seg
, n
);
2164 /* Handle the .align pseudo-op. This aligns to a power of two. We
2165 hook here to latch the current alignment. */
2168 s_d30v_align (ignore
)
2169 int ignore ATTRIBUTE_UNUSED
;
2172 char fill
, *pfill
= NULL
;
2173 long max_alignment
= 15;
2175 align
= get_absolute_expression ();
2176 if (align
> max_alignment
)
2178 align
= max_alignment
;
2179 as_warn (_("Alignment too large: %d assumed"), align
);
2183 as_warn (_("Alignment negative: 0 assumed"));
2187 if (*input_line_pointer
== ',')
2189 input_line_pointer
++;
2190 fill
= get_absolute_expression ();
2194 d30v_last_label
= NULL
;
2195 d30v_align (align
, pfill
, NULL
);
2197 demand_empty_rest_of_line ();
2200 /* Handle the .text pseudo-op. This is like the usual one, but it
2201 clears the saved last label and resets known alignment. */
2209 d30v_last_label
= NULL
;
2210 d30v_current_align
= 0;
2211 d30v_current_align_seg
= now_seg
;
2214 /* Handle the .data pseudo-op. This is like the usual one, but it
2215 clears the saved last label and resets known alignment. */
2222 d30v_last_label
= NULL
;
2223 d30v_current_align
= 0;
2224 d30v_current_align_seg
= now_seg
;
2227 /* Handle the .section pseudo-op. This is like the usual one, but it
2228 clears the saved last label and resets known alignment. */
2231 s_d30v_section (ignore
)
2234 obj_elf_section (ignore
);
2235 d30v_last_label
= NULL
;
2236 d30v_current_align
= 0;
2237 d30v_current_align_seg
= now_seg
;