1 /* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
23 #include "safe-ctype.h"
25 #include "opcode/d30v.h"
27 const char comment_chars
[] = ";";
28 const char line_comment_chars
[] = "#";
29 const char line_separator_chars
[] = "";
30 const char *md_shortopts
= "OnNcC";
31 const char EXP_CHARS
[] = "eE";
32 const char FLT_CHARS
[] = "dD";
42 #define NOP_MULTIPLY 1
44 static int warn_nops
= 0;
45 static int Optimizing
= 0;
46 static int warn_register_name_conflicts
= 1;
52 typedef enum _exec_type
54 EXEC_UNKNOWN
, /* no order specified */
55 EXEC_PARALLEL
, /* done in parallel (FM=00) */
56 EXEC_SEQ
, /* sequential (FM=01) */
57 EXEC_REVSEQ
/* reverse sequential (FM=10) */
61 #define MAX_INSN_FIXUPS (5)
68 bfd_reloc_code_real_type reloc
;
71 typedef struct _fixups
74 struct d30v_fixup fix
[MAX_INSN_FIXUPS
];
78 static Fixups FixUps
[2];
79 static Fixups
*fixups
;
81 /* Whether current and previous instruction are word multiply insns. */
82 static int cur_mul32_p
= 0;
83 static int prev_mul32_p
= 0;
85 /* The flag_explicitly_parallel is true iff the instruction being assembled
86 has been explicitly written as a parallel short-instruction pair by the
87 human programmer. It is used in parallel_ok () to distinguish between
88 those dangerous parallelizations attempted by the human, which are to be
89 allowed, and those attempted by the assembler, which are not. It is set
90 from md_assemble (). */
91 static int flag_explicitly_parallel
= 0;
92 static int flag_xp_state
= 0;
94 /* Whether current and previous left sub-instruction disables
95 execution of right sub-instruction. */
96 static int cur_left_kills_right_p
= 0;
97 static int prev_left_kills_right_p
= 0;
99 /* The known current alignment of the current section. */
100 static int d30v_current_align
;
101 static segT d30v_current_align_seg
;
103 /* The last seen label in the current section. This is used to auto-align
104 labels preceeding instructions. */
105 static symbolS
*d30v_last_label
;
108 #define NOP_LEFT ((long long) NOP << 32)
109 #define NOP_RIGHT ((long long) NOP)
110 #define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
112 /* Local functions. */
113 static int reg_name_search
PARAMS ((char *name
));
114 static int register_name
PARAMS ((expressionS
*expressionP
));
115 static int check_range
PARAMS ((unsigned long num
, int bits
, int flags
));
116 static int postfix
PARAMS ((char *p
));
117 static bfd_reloc_code_real_type get_reloc
PARAMS ((struct d30v_operand
*op
, int rel_flag
));
118 static int get_operands
PARAMS ((expressionS exp
[], int cmp_hack
));
119 static struct d30v_format
*find_format
PARAMS ((struct d30v_opcode
*opcode
,
120 expressionS ops
[],int fsize
, int cmp_hack
));
121 static long long build_insn
PARAMS ((struct d30v_insn
*opcode
, expressionS
*opers
));
122 static void write_long
PARAMS ((struct d30v_insn
*opcode
, long long insn
, Fixups
*fx
));
123 static void write_1_short
PARAMS ((struct d30v_insn
*opcode
, long long insn
,
124 Fixups
*fx
, int use_sequential
));
125 static int write_2_short
PARAMS ((struct d30v_insn
*opcode1
, long long insn1
,
126 struct d30v_insn
*opcode2
, long long insn2
, exec_type_enum exec_type
, Fixups
*fx
));
127 static long long do_assemble
PARAMS ((char *str
, struct d30v_insn
*opcode
,
128 int shortp
, int is_parallel
));
129 static int parallel_ok
PARAMS ((struct d30v_insn
*opcode1
, unsigned long insn1
,
130 struct d30v_insn
*opcode2
, unsigned long insn2
,
131 exec_type_enum exec_type
));
132 static void d30v_number_to_chars
PARAMS ((char *buf
, long long value
, int nbytes
));
133 static void check_size
PARAMS ((long value
, int bits
, char *file
, int line
));
134 static void d30v_align
PARAMS ((int, char *, symbolS
*));
135 static void s_d30v_align
PARAMS ((int));
136 static void s_d30v_text
PARAMS ((int));
137 static void s_d30v_data
PARAMS ((int));
138 static void s_d30v_section
PARAMS ((int));
140 struct option md_longopts
[] =
142 {NULL
, no_argument
, NULL
, 0}
145 size_t md_longopts_size
= sizeof (md_longopts
);
147 /* The target specific pseudo-ops which we support. */
148 const pseudo_typeS md_pseudo_table
[] =
151 { "hword", cons
, 2 },
152 { "align", s_d30v_align
, 0 },
153 { "text", s_d30v_text
, 0 },
154 { "data", s_d30v_data
, 0 },
155 { "section", s_d30v_section
, 0 },
156 { "section.s", s_d30v_section
, 0 },
157 { "sect", s_d30v_section
, 0 },
158 { "sect.s", s_d30v_section
, 0 },
162 /* Opcode hash table. */
163 static struct hash_control
*d30v_hash
;
165 /* Do a binary search of the pre_defined_registers array to see if
166 NAME is a valid regiter name. Return the register number from the
167 array on success, or -1 on failure. */
170 reg_name_search (name
)
173 int middle
, low
, high
;
177 high
= reg_name_cnt () - 1;
181 middle
= (low
+ high
) / 2;
182 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
189 if (symbol_find (name
) != NULL
)
191 if (warn_register_name_conflicts
)
192 as_warn (_("Register name %s conflicts with symbol of the same name"),
196 return pre_defined_registers
[middle
].value
;
204 /* Check the string at input_line_pointer to see if it is a valid
208 register_name (expressionP
)
209 expressionS
*expressionP
;
212 char c
, *p
= input_line_pointer
;
214 while (*p
&& *p
!= '\n' && *p
!= '\r' && *p
!= ',' && *p
!= ' ' && *p
!= ')')
221 /* Look to see if it's in the register table. */
222 reg_number
= reg_name_search (input_line_pointer
);
225 expressionP
->X_op
= O_register
;
226 /* Temporarily store a pointer to the string here. */
227 expressionP
->X_op_symbol
= (symbolS
*) input_line_pointer
;
228 expressionP
->X_add_number
= reg_number
;
229 input_line_pointer
= p
;
238 check_range (num
, bits
, flags
)
245 /* Don't bother checking 32-bit values. */
248 if (sizeof (unsigned long) * CHAR_BIT
== 32)
251 /* We don't record signed or unsigned for 32-bit quantities.
253 min
= -((unsigned long) 1 << (bits
- 1));
254 max
= ((unsigned long) 1 << bits
) - 1;
255 return (long)num
< min
|| (long)num
> max
;
258 if (flags
& OPERAND_SHIFT
)
260 /* We know that all shifts are right by three bits. */
262 if (flags
& OPERAND_SIGNED
)
263 num
= (unsigned long) ((long) num
>= 0)
264 ? (((long) num
) >> 3)
265 : ((num
>> 3) | ~(~(unsigned long) 0 >> 3));
270 if (flags
& OPERAND_SIGNED
)
272 max
= ((unsigned long) 1 << (bits
- 1)) - 1;
273 min
= - ((unsigned long) 1 << (bits
- 1));
274 return (long)num
> max
|| (long)num
< min
;
278 max
= ((unsigned long) 1 << bits
) - 1;
280 return num
> max
|| num
< min
;
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
)
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
)
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
)
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: %d"), 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
;
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 occuring
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 printf ("writing out %llx\n", insn
);
934 d30v_number_to_chars (f
, insn
, 8);
936 /* If the previous instruction was a 32-bit multiply but it is put into a
937 parallel container, mark the current instruction as being a 32-bit
939 if (prev_mul32_p
&& exec_type
== EXEC_PARALLEL
)
942 for (j
= 0; j
< 2; j
++)
944 for (i
= 0; i
< fx
->fc
; i
++)
946 if (fx
->fix
[i
].reloc
)
948 where
= (f
- frag_now
->fr_literal
) + 4 * j
;
950 fix_new_exp (frag_now
,
966 /* Check 2 instructions and determine if they can be safely
967 executed in parallel. Return 1 if they can be. */
970 parallel_ok (op1
, insn1
, op2
, insn2
, exec_type
)
971 struct d30v_insn
*op1
, *op2
;
972 unsigned long insn1
, insn2
;
973 exec_type_enum exec_type
;
975 int i
, j
, shift
, regno
, bits
, ecc
;
976 unsigned long flags
, mask
, flags_set1
, flags_set2
, flags_used1
, flags_used2
;
977 unsigned long ins
, mod_reg
[2][3], used_reg
[2][3], flag_reg
[2];
978 struct d30v_format
*f
;
979 struct d30v_opcode
*op
;
981 /* Section 4.3: Both instructions must not be IU or MU only. */
982 if ((op1
->op
->unit
== IU
&& op2
->op
->unit
== IU
)
983 || (op1
->op
->unit
== MU
&& op2
->op
->unit
== MU
))
986 /* First instruction must not be a jump to safely optimize, unless this
987 is an explicit parallel operation. */
988 if (exec_type
!= EXEC_PARALLEL
989 && (op1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
)))
992 /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
993 then it is safe to allow the two to be done as parallel ops, since only
994 one will ever be executed at a time. */
995 if ((op1
->ecc
== ECC_TX
&& op2
->ecc
== ECC_FX
)
996 || (op1
->ecc
== ECC_FX
&& op2
->ecc
== ECC_TX
)
997 || (op1
->ecc
== ECC_XT
&& op2
->ecc
== ECC_XF
)
998 || (op1
->ecc
== ECC_XF
&& op2
->ecc
== ECC_XT
))
1003 [2] a0, a1, flag registers. */
1004 for (j
= 0; j
< 2; j
++)
1022 mod_reg
[j
][0] = mod_reg
[j
][1] = 0;
1023 used_reg
[j
][0] = used_reg
[j
][1] = 0;
1025 if (flag_explicitly_parallel
)
1027 /* For human specified parallel instructions we have been asked
1028 to ignore the possibility that both instructions could modify
1029 bits in the PSW, so we initialise the mod & used arrays to 0.
1030 We have been asked, however, to refuse to allow parallel
1031 instructions which explicitly set the same flag register,
1032 eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
1033 for the use of a flag register and set a bit in the mod or used
1034 array appropriately. */
1040 mod_reg
[j
][2] = (op
->flags_set
& FLAG_ALL
);
1041 used_reg
[j
][2] = (op
->flags_used
& FLAG_ALL
);
1044 /* BSR/JSR always sets R62. */
1045 if (op
->flags_used
& FLAG_JSR
)
1046 mod_reg
[j
][1] = (1L << (62 - 32));
1048 /* Conditional execution affects the flags_used. */
1053 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_0
;
1058 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_1
;
1063 used_reg
[j
][2] |= flag_reg
[j
] = (FLAG_0
| FLAG_1
);
1067 for (i
= 0; f
->operands
[i
]; i
++)
1069 flags
= d30v_operand_table
[f
->operands
[i
]].flags
;
1070 shift
= 12 - d30v_operand_table
[f
->operands
[i
]].position
;
1071 bits
= d30v_operand_table
[f
->operands
[i
]].bits
;
1075 mask
= 0x7FFFFFFF >> (31 - bits
);
1077 if ((flags
& OPERAND_PLUS
) || (flags
& OPERAND_MINUS
))
1079 /* This is a post-increment or post-decrement.
1080 The previous register needs to be marked as modified. */
1081 shift
= 12 - d30v_operand_table
[f
->operands
[i
- 1]].position
;
1082 regno
= (ins
>> shift
) & 0x3f;
1084 mod_reg
[j
][1] |= 1L << (regno
- 32);
1086 mod_reg
[j
][0] |= 1L << regno
;
1088 else if (flags
& OPERAND_REG
)
1090 regno
= (ins
>> shift
) & mask
;
1091 /* The memory write functions don't have a destination
1093 if ((flags
& OPERAND_DEST
) && !(op
->flags_set
& FLAG_MEM
))
1095 /* MODIFIED registers and flags. */
1096 if (flags
& OPERAND_ACC
)
1099 mod_reg
[j
][2] |= FLAG_A0
;
1100 else if (regno
== 1)
1101 mod_reg
[j
][2] |= FLAG_A1
;
1105 else if (flags
& OPERAND_FLAG
)
1106 mod_reg
[j
][2] |= 1L << regno
;
1107 else if (!(flags
& OPERAND_CONTROL
))
1111 /* Need to check if there are two destination
1112 registers, for example ld2w. */
1113 if (flags
& OPERAND_2REG
)
1118 for (r
= regno
; r
<= regno
+ z
; r
++)
1121 mod_reg
[j
][1] |= 1L << (r
- 32);
1123 mod_reg
[j
][0] |= 1L << r
;
1129 /* USED, but not modified registers and flags. */
1130 if (flags
& OPERAND_ACC
)
1133 used_reg
[j
][2] |= FLAG_A0
;
1134 else if (regno
== 1)
1135 used_reg
[j
][2] |= FLAG_A1
;
1139 else if (flags
& OPERAND_FLAG
)
1140 used_reg
[j
][2] |= 1L << regno
;
1141 else if (!(flags
& OPERAND_CONTROL
))
1145 /* Need to check if there are two source
1146 registers, for example st2w. */
1147 if (flags
& OPERAND_2REG
)
1152 for (r
= regno
; r
<= regno
+ z
; r
++)
1155 used_reg
[j
][1] |= 1L << (r
- 32);
1157 used_reg
[j
][0] |= 1L << r
;
1165 flags_set1
= op1
->op
->flags_set
;
1166 flags_set2
= op2
->op
->flags_set
;
1167 flags_used1
= op1
->op
->flags_used
;
1168 flags_used2
= op2
->op
->flags_used
;
1170 /* Check for illegal combinations with ADDppp/SUBppp. */
1171 if (((flags_set1
& FLAG_NOT_WITH_ADDSUBppp
) != 0
1172 && (flags_used2
& FLAG_ADDSUBppp
) != 0)
1173 || ((flags_set2
& FLAG_NOT_WITH_ADDSUBppp
) != 0
1174 && (flags_used1
& FLAG_ADDSUBppp
) != 0))
1177 /* Load instruction combined with half-word multiply is illegal. */
1178 if (((flags_used1
& FLAG_MEM
) != 0 && (flags_used2
& FLAG_MUL16
))
1179 || ((flags_used2
& FLAG_MEM
) != 0 && (flags_used1
& FLAG_MUL16
)))
1182 /* Specifically allow add || add by removing carry, overflow bits dependency.
1183 This is safe, even if an addc follows since the IU takes the argument in
1184 the right container, and it writes its results last.
1185 However, don't paralellize add followed by addc or sub followed by
1187 if (mod_reg
[0][2] == FLAG_CVVA
&& mod_reg
[1][2] == FLAG_CVVA
1188 && (used_reg
[0][2] & ~flag_reg
[0]) == 0
1189 && (used_reg
[1][2] & ~flag_reg
[1]) == 0
1190 && op1
->op
->unit
== EITHER
&& op2
->op
->unit
== EITHER
)
1192 mod_reg
[0][2] = mod_reg
[1][2] = 0;
1195 for (j
= 0; j
< 3; j
++)
1197 /* If the second instruction depends on the first, we obviously
1198 cannot parallelize. Note, the mod flag implies use, so
1199 check that as well. */
1200 /* If flag_explicitly_parallel is set, then the case of the
1201 second instruction using a register the first instruction
1202 modifies is assumed to be okay; we trust the human. We
1203 don't trust the human if both instructions modify the same
1204 register but we do trust the human if they modify the same
1206 /* We have now been requested not to trust the human if the
1207 instructions modify the same flag registers either. */
1208 if (flag_explicitly_parallel
)
1210 if ((mod_reg
[0][j
] & mod_reg
[1][j
]) != 0)
1214 if ((mod_reg
[0][j
] & (mod_reg
[1][j
] | used_reg
[1][j
])) != 0)
1221 /* This is the main entry point for the machine-dependent assembler.
1222 STR points to a machine-dependent instruction. This function is
1223 supposed to emit the frags/bytes it assembles to. For the D30V, it
1224 mostly handles the special VLIW parsing and packing and leaves the
1225 difficult stuff to do_assemble (). */
1227 static long long prev_insn
= -1;
1228 static struct d30v_insn prev_opcode
;
1229 static subsegT prev_subseg
;
1230 static segT prev_seg
= 0;
1236 struct d30v_insn opcode
;
1238 /* Execution type; parallel, etc. */
1239 exec_type_enum extype
= EXEC_UNKNOWN
;
1240 /* Saved extype. Used for multiline instructions. */
1241 static exec_type_enum etype
= EXEC_UNKNOWN
;
1244 if ((prev_insn
!= -1) && prev_seg
1245 && ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1246 d30v_cleanup (false);
1248 if (d30v_current_align
< 3)
1249 d30v_align (3, NULL
, d30v_last_label
);
1250 else if (d30v_current_align
> 3)
1251 d30v_current_align
= 3;
1252 d30v_last_label
= NULL
;
1254 flag_explicitly_parallel
= 0;
1256 if (etype
== EXEC_UNKNOWN
)
1258 /* Look for the special multiple instruction separators. */
1259 str2
= strstr (str
, "||");
1262 extype
= EXEC_PARALLEL
;
1267 str2
= strstr (str
, "->");
1272 str2
= strstr (str
, "<-");
1274 extype
= EXEC_REVSEQ
;
1278 /* STR2 points to the separator, if one. */
1283 /* If two instructions are present and we already have one saved,
1284 then first write it out. */
1285 d30v_cleanup (false);
1287 /* Assemble first instruction and save it. */
1288 prev_insn
= do_assemble (str
, &prev_opcode
, 1, 0);
1289 if (prev_insn
== -1)
1290 as_bad (_("Cannot assemble instruction"));
1291 if (prev_opcode
.form
!= NULL
&& prev_opcode
.form
->form
>= LONG
)
1292 as_bad (_("First opcode is long. Unable to mix instructions as specified."));
1293 fixups
= fixups
->next
;
1296 prev_subseg
= now_subseg
;
1300 insn
= do_assemble (str
, &opcode
,
1301 (extype
!= EXEC_UNKNOWN
|| etype
!= EXEC_UNKNOWN
),
1302 extype
== EXEC_PARALLEL
);
1305 if (extype
!= EXEC_UNKNOWN
)
1307 as_bad (_("Cannot assemble instruction"));
1311 if (etype
!= EXEC_UNKNOWN
)
1314 etype
= EXEC_UNKNOWN
;
1317 /* Word multiply instructions must not be followed by either a load or a
1318 16-bit multiply instruction in the next cycle. */
1319 if ( (extype
!= EXEC_REVSEQ
)
1321 && (opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1323 /* However, load and multiply should able to be combined in a parallel
1324 operation, so check for that first. */
1326 && (opcode
.op
->flags_used
& FLAG_MEM
)
1327 && opcode
.form
->form
< LONG
1328 && (extype
== EXEC_PARALLEL
|| (Optimizing
&& extype
== EXEC_UNKNOWN
))
1329 && parallel_ok (&prev_opcode
, (long) prev_insn
,
1330 &opcode
, (long) insn
, extype
)
1331 && write_2_short (&prev_opcode
, (long) prev_insn
,
1332 &opcode
, (long) insn
, extype
, fixups
) == 0)
1334 /* No instructions saved. */
1340 /* Can't parallelize, flush previous instruction and emit a
1341 word of NOPS, unless the previous instruction is a NOP,
1342 in which case just flush it, as this will generate a word
1345 if (prev_insn
!= -1 && (strcmp (prev_opcode
.op
->name
, "nop") == 0))
1346 d30v_cleanup (false);
1351 if (prev_insn
!= -1)
1352 d30v_cleanup (true);
1356 d30v_number_to_chars (f
, NOP2
, 8);
1358 if (warn_nops
== NOP_ALL
|| warn_nops
== NOP_MULTIPLY
)
1360 if (opcode
.op
->flags_used
& FLAG_MEM
)
1361 as_warn (_("word of NOPs added between word multiply and load"));
1363 as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1368 extype
= EXEC_UNKNOWN
;
1371 else if ( (extype
== EXEC_REVSEQ
)
1373 && (prev_opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1375 /* Can't parallelize, flush current instruction and add a
1377 write_1_short (&opcode
, (long) insn
, fixups
->next
->next
, true);
1379 /* Make the previous instruction the current one. */
1380 extype
= EXEC_UNKNOWN
;
1383 now_subseg
= prev_subseg
;
1385 cur_mul32_p
= prev_mul32_p
;
1387 memcpy (&opcode
, &prev_opcode
, sizeof (prev_opcode
));
1390 /* If this is a long instruction, write it and any previous short
1392 if (opcode
.form
->form
>= LONG
)
1394 if (extype
!= EXEC_UNKNOWN
)
1395 as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1396 d30v_cleanup (false);
1397 write_long (&opcode
, insn
, fixups
);
1400 else if ((prev_insn
!= -1)
1402 (&prev_opcode
, (long) prev_insn
, &opcode
,
1403 (long) insn
, extype
, fixups
) == 0))
1405 /* No instructions saved. */
1410 if (extype
!= EXEC_UNKNOWN
)
1411 as_bad (_("Unable to mix instructions as specified"));
1413 /* Save off last instruction so it may be packed on next pass. */
1414 memcpy (&prev_opcode
, &opcode
, sizeof (prev_opcode
));
1417 prev_subseg
= now_subseg
;
1418 fixups
= fixups
->next
;
1419 prev_mul32_p
= cur_mul32_p
;
1423 /* Assemble a single instruction and return an opcode.
1424 Return -1 (an invalid opcode) on error. */
1426 #define NAME_BUF_LEN 20
1429 do_assemble (str
, opcode
, shortp
, is_parallel
)
1431 struct d30v_insn
*opcode
;
1435 unsigned char *op_start
;
1436 unsigned char *save
;
1437 unsigned char *op_end
;
1438 char name
[NAME_BUF_LEN
];
1441 int fsize
= (shortp
? FORCE_SHORT
: 0);
1442 expressionS myops
[6];
1445 /* Drop leading whitespace. */
1449 /* Find the opcode end. */
1450 for (op_start
= op_end
= (unsigned char *) (str
);
1452 && nlen
< (NAME_BUF_LEN
- 1)
1454 && !is_end_of_line
[*op_end
] && *op_end
!= ' ';
1457 name
[nlen
] = TOLOWER (op_start
[nlen
]);
1466 /* If there is an execution condition code, handle it. */
1470 while ((i
< ECC_MAX
) && strncasecmp (d30v_ecc_names
[i
], op_end
+ 1, 2))
1476 strncpy (tmp
, op_end
+ 1, 2);
1478 as_bad (_("unknown condition code: %s"), tmp
);
1482 printf ("condition code=%d\n", i
);
1488 opcode
->ecc
= ECC_AL
;
1490 /* CMP and CMPU change their name based on condition codes. */
1491 if (!strncmp (name
, "cmp", 3))
1494 char **str
= (char **) d30v_cc_names
;
1500 for (i
= 1; *str
&& strncmp (*str
, &name
[p
], 2); i
++, str
++)
1503 /* cmpu only supports some condition codes. */
1509 as_bad (_("cmpu doesn't support condition code %s"), &name
[p
]);
1516 as_bad (_("unknown condition code: %s"), &name
[p
]);
1526 printf ("cmp_hack=%d\n", cmp_hack
);
1529 /* Need to look for .s or .l. */
1530 if (name
[nlen
- 2] == '.')
1532 switch (name
[nlen
- 1])
1535 fsize
= FORCE_SHORT
;
1544 /* Find the first opcode with the proper name. */
1545 opcode
->op
= (struct d30v_opcode
*) hash_find (d30v_hash
, name
);
1546 if (opcode
->op
== NULL
)
1548 as_bad (_("unknown opcode: %s"), name
);
1552 save
= input_line_pointer
;
1553 input_line_pointer
= op_end
;
1554 while (!(opcode
->form
= find_format (opcode
->op
, myops
, fsize
, cmp_hack
)))
1557 if (opcode
->op
->name
== NULL
|| strcmp (opcode
->op
->name
, name
))
1559 as_bad (_("operands for opcode `%s' do not match any valid format"),
1564 input_line_pointer
= save
;
1566 insn
= build_insn (opcode
, myops
);
1568 /* Propigate multiply status. */
1571 if (is_parallel
&& prev_mul32_p
)
1575 prev_mul32_p
= cur_mul32_p
;
1576 cur_mul32_p
= (opcode
->op
->flags_used
& FLAG_MUL32
) != 0;
1580 /* Propagate left_kills_right status. */
1583 prev_left_kills_right_p
= cur_left_kills_right_p
;
1585 if (opcode
->op
->flags_set
& FLAG_LKR
)
1587 cur_left_kills_right_p
= 1;
1589 if (strcmp (opcode
->op
->name
, "mvtsys") == 0)
1591 /* Left kills right for only mvtsys only for
1592 PSW/PSWH/PSWL/flags target. */
1593 if ((myops
[0].X_op
== O_register
) &&
1594 ((myops
[0].X_add_number
== OPERAND_CONTROL
) || /* psw */
1595 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+2) || /* pswh */
1596 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+1) || /* pswl */
1597 (myops
[0].X_add_number
== OPERAND_FLAG
+0) || /* f0 */
1598 (myops
[0].X_add_number
== OPERAND_FLAG
+1) || /* f1 */
1599 (myops
[0].X_add_number
== OPERAND_FLAG
+2) || /* f2 */
1600 (myops
[0].X_add_number
== OPERAND_FLAG
+3) || /* f3 */
1601 (myops
[0].X_add_number
== OPERAND_FLAG
+4) || /* f4 */
1602 (myops
[0].X_add_number
== OPERAND_FLAG
+5) || /* f5 */
1603 (myops
[0].X_add_number
== OPERAND_FLAG
+6) || /* f6 */
1604 (myops
[0].X_add_number
== OPERAND_FLAG
+7))) /* f7 */
1606 cur_left_kills_right_p
= 1;
1610 /* Other mvtsys target registers don't kill right
1612 cur_left_kills_right_p
= 0;
1617 cur_left_kills_right_p
= 0;
1623 /* Get a pointer to an entry in the format table.
1624 It must look at all formats for an opcode and use the operands
1625 to choose the correct one. Return NULL on error. */
1627 static struct d30v_format
*
1628 find_format (opcode
, myops
, fsize
, cmp_hack
)
1629 struct d30v_opcode
*opcode
;
1630 expressionS myops
[];
1634 int numops
, match
, index
, i
= 0, j
, k
;
1635 struct d30v_format
*fm
;
1640 /* Get all the operands and save them as expressions. */
1641 numops
= get_operands (myops
, cmp_hack
);
1643 while ((index
= opcode
->format
[i
++]) != 0)
1645 if (fsize
== FORCE_SHORT
&& index
>= LONG
)
1648 if (fsize
== FORCE_LONG
&& index
< LONG
)
1651 fm
= (struct d30v_format
*) &d30v_format_table
[index
];
1653 while (fm
->form
== index
)
1656 /* Now check the operands for compatibility. */
1657 for (j
= 0; match
&& fm
->operands
[j
]; j
++)
1659 int flags
= d30v_operand_table
[fm
->operands
[j
]].flags
;
1660 int bits
= d30v_operand_table
[fm
->operands
[j
]].bits
;
1661 int X_op
= myops
[j
].X_op
;
1662 int num
= myops
[j
].X_add_number
;
1664 if (flags
& OPERAND_SPECIAL
)
1666 else if (X_op
== O_illegal
)
1668 else if (flags
& OPERAND_REG
)
1670 if (X_op
!= O_register
1671 || ((flags
& OPERAND_ACC
) && !(num
& OPERAND_ACC
))
1672 || (!(flags
& OPERAND_ACC
) && (num
& OPERAND_ACC
))
1673 || ((flags
& OPERAND_FLAG
) && !(num
& OPERAND_FLAG
))
1674 || (!(flags
& (OPERAND_FLAG
| OPERAND_CONTROL
)) && (num
& OPERAND_FLAG
))
1675 || ((flags
& OPERAND_CONTROL
)
1676 && !(num
& (OPERAND_CONTROL
| OPERAND_FLAG
))))
1681 else if (((flags
& OPERAND_MINUS
)
1682 && (X_op
!= O_absent
|| num
!= OPERAND_MINUS
))
1683 || ((flags
& OPERAND_PLUS
)
1684 && (X_op
!= O_absent
|| num
!= OPERAND_PLUS
))
1685 || ((flags
& OPERAND_ATMINUS
)
1686 && (X_op
!= O_absent
|| num
!= OPERAND_ATMINUS
))
1687 || ((flags
& OPERAND_ATPAR
)
1688 && (X_op
!= O_absent
|| num
!= OPERAND_ATPAR
))
1689 || ((flags
& OPERAND_ATSIGN
)
1690 && (X_op
!= O_absent
|| num
!= OPERAND_ATSIGN
)))
1694 else if (flags
& OPERAND_NUM
)
1696 /* A number can be a constant or symbol expression. */
1698 /* If we have found a register name, but that name
1699 also matches a symbol, then re-parse the name as
1701 if (X_op
== O_register
1702 && symbol_find ((char *) myops
[j
].X_op_symbol
))
1704 input_line_pointer
= (char *) myops
[j
].X_op_symbol
;
1705 expression (&myops
[j
]);
1708 /* Turn an expression into a symbol for later resolution. */
1709 if (X_op
!= O_absent
&& X_op
!= O_constant
1710 && X_op
!= O_symbol
&& X_op
!= O_register
1713 symbolS
*sym
= make_expr_symbol (&myops
[j
]);
1714 myops
[j
].X_op
= X_op
= O_symbol
;
1715 myops
[j
].X_add_symbol
= sym
;
1716 myops
[j
].X_add_number
= num
= 0;
1719 if (fm
->form
>= LONG
)
1721 /* If we're testing for a LONG format, either fits. */
1722 if (X_op
!= O_constant
&& X_op
!= O_symbol
)
1725 else if (fm
->form
< LONG
1726 && ((fsize
== FORCE_SHORT
&& X_op
== O_symbol
)
1727 || (fm
->form
== SHORT_D2
&& j
== 0)))
1730 /* This is the tricky part. Will the constant or symbol
1731 fit into the space in the current format? */
1732 else if (X_op
== O_constant
)
1734 if (check_range (num
, bits
, flags
))
1737 else if (X_op
== O_symbol
1738 && S_IS_DEFINED (myops
[j
].X_add_symbol
)
1739 && S_GET_SEGMENT (myops
[j
].X_add_symbol
) == now_seg
1740 && opcode
->reloc_flag
== RELOC_PCREL
)
1742 /* If the symbol is defined, see if the value will fit
1743 into the form we're considering. */
1747 /* Calculate the current address by running through the
1748 previous frags and adding our current offset. */
1750 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1751 value
+= f
->fr_fix
+ f
->fr_offset
;
1752 value
= (S_GET_VALUE (myops
[j
].X_add_symbol
) - value
1753 - (obstack_next_free (&frchain_now
->frch_obstack
)
1754 - frag_now
->fr_literal
));
1755 if (check_range (value
, bits
, flags
))
1763 printf ("through the loop: match=%d\n", match
);
1765 /* We're only done if the operands matched so far AND there
1766 are no more to check. */
1767 if (match
&& myops
[j
].X_op
== 0)
1769 /* Final check - issue a warning if an odd numbered register
1770 is used as the first register in an instruction that reads
1771 or writes 2 registers. */
1773 for (j
= 0; fm
->operands
[j
]; j
++)
1774 if (myops
[j
].X_op
== O_register
1775 && (myops
[j
].X_add_number
& 1)
1776 && (d30v_operand_table
[fm
->operands
[j
]].flags
& OPERAND_2REG
))
1777 as_warn (_("Odd numbered register used as target of multi-register instruction"));
1781 fm
= (struct d30v_format
*) &d30v_format_table
[++k
];
1784 printf ("trying another format: i=%d\n", i
);
1790 /* If while processing a fixup, a reloc really needs to be created,
1791 then it is done here. */
1794 tc_gen_reloc (seg
, fixp
)
1799 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1800 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1801 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1802 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1803 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1804 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1806 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1807 _("reloc %d not supported by object file format"),
1808 (int) fixp
->fx_r_type
);
1811 reloc
->addend
= fixp
->fx_addnumber
;
1816 md_estimate_size_before_relax (fragp
, seg
)
1825 md_pcrel_from_section (fixp
, sec
)
1829 if (fixp
->fx_addsy
!= (symbolS
*) NULL
1830 && (!S_IS_DEFINED (fixp
->fx_addsy
)
1831 || (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1833 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1837 md_apply_fix3 (fixP
, valP
, seg
)
1843 unsigned long insn
, insn2
;
1844 long value
= * (long *) valP
;
1846 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1849 else if (fixP
->fx_pcrel
)
1854 value
= fixP
->fx_offset
;
1856 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1858 if (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)
1859 value
-= S_GET_VALUE (fixP
->fx_subsy
);
1861 /* We don't actually support subtracting a symbol. */
1862 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1863 _("expression too complex"));
1867 /* Fetch the instruction, insert the fully resolved operand
1868 value, and stuff the instruction back again. */
1869 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1870 insn
= bfd_getb32 ((unsigned char *) where
);
1872 switch (fixP
->fx_r_type
)
1874 case BFD_RELOC_8
: /* Check for a bad .byte directive. */
1875 if (fixP
->fx_addsy
!= NULL
)
1876 as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1877 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1878 else if (((unsigned)value
) > 0xff)
1879 as_bad (_("line %d: unable to place value %x into a byte"),
1880 fixP
->fx_line
, value
);
1882 *(unsigned char *) where
= value
;
1885 case BFD_RELOC_16
: /* Check for a bad .short directive. */
1886 if (fixP
->fx_addsy
!= NULL
)
1887 as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1888 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1889 else if (((unsigned)value
) > 0xffff)
1890 as_bad (_("line %d: unable to place value %x into a short"),
1891 fixP
->fx_line
, value
);
1893 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1896 case BFD_RELOC_64
: /* Check for a bad .quad directive. */
1897 if (fixP
->fx_addsy
!= NULL
)
1898 as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1899 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1902 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1903 bfd_putb32 (0, ((unsigned char *) where
) + 4);
1907 case BFD_RELOC_D30V_6
:
1908 check_size (value
, 6, fixP
->fx_file
, fixP
->fx_line
);
1909 insn
|= value
& 0x3F;
1910 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1913 case BFD_RELOC_D30V_9_PCREL
:
1914 if (fixP
->fx_where
& 0x7)
1919 fixP
->fx_r_type
= BFD_RELOC_D30V_9_PCREL_R
;
1921 check_size (value
, 9, fixP
->fx_file
, fixP
->fx_line
);
1922 insn
|= ((value
>> 3) & 0x3F) << 12;
1923 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1926 case BFD_RELOC_D30V_15
:
1927 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
1928 insn
|= (value
>> 3) & 0xFFF;
1929 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1932 case BFD_RELOC_D30V_15_PCREL
:
1933 if (fixP
->fx_where
& 0x7)
1938 fixP
->fx_r_type
= BFD_RELOC_D30V_15_PCREL_R
;
1940 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
1941 insn
|= (value
>> 3) & 0xFFF;
1942 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1945 case BFD_RELOC_D30V_21
:
1946 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
1947 insn
|= (value
>> 3) & 0x3FFFF;
1948 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1951 case BFD_RELOC_D30V_21_PCREL
:
1952 if (fixP
->fx_where
& 0x7)
1957 fixP
->fx_r_type
= BFD_RELOC_D30V_21_PCREL_R
;
1959 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
1960 insn
|= (value
>> 3) & 0x3FFFF;
1961 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1964 case BFD_RELOC_D30V_32
:
1965 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
1966 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
1967 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
1968 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
1969 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1970 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
1973 case BFD_RELOC_D30V_32_PCREL
:
1974 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
1975 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
1976 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
1977 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
1978 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1979 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
1983 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1987 as_bad (_("line %d: unknown relocation type: 0x%x"),
1988 fixP
->fx_line
, fixP
->fx_r_type
);
1992 /* Called after the assembler has finished parsing the input file or
1993 after a label is defined. Because the D30V assembler sometimes
1994 saves short instructions to see if it can package them with the
1995 next instruction, there may be a short instruction that still needs
1999 d30v_cleanup (use_sequential
)
2005 if (prev_insn
!= -1)
2008 subseg
= now_subseg
;
2009 subseg_set (prev_seg
, prev_subseg
);
2010 write_1_short (&prev_opcode
, (long) prev_insn
, fixups
->next
,
2012 subseg_set (seg
, subseg
);
2015 prev_mul32_p
= false;
2022 d30v_number_to_chars (buf
, value
, n
)
2023 char *buf
; /* Return 'nbytes' of chars here. */
2024 long long value
; /* The value of the bits. */
2025 int n
; /* Number of bytes in the output. */
2029 buf
[n
] = value
& 0xff;
2034 /* This function is called at the start of every line. It checks to
2035 see if the first character is a '.', which indicates the start of a
2036 pseudo-op. If it is, then write out any unwritten instructions. */
2041 char *c
= input_line_pointer
;
2043 while (ISSPACE (*c
))
2047 d30v_cleanup (false);
2051 check_size (value
, bits
, file
, line
)
2064 max
= (1 << (bits
- 1)) - 1;
2067 as_bad_where (file
, line
, _("value too large to fit in %d bits"), bits
);
2072 /* d30v_frob_label() is called when after a label is recognized. */
2075 d30v_frob_label (lab
)
2078 /* Emit any pending instructions. */
2079 d30v_cleanup (false);
2081 /* Update the label's address with the current output pointer. */
2082 symbol_set_frag (lab
, frag_now
);
2083 S_SET_VALUE (lab
, (valueT
) frag_now_fix ());
2085 /* Record this label for future adjustment after we find out what
2086 kind of data it references, and the required alignment therewith. */
2087 d30v_last_label
= lab
;
2090 /* Hook into cons for capturing alignment changes. */
2093 d30v_cons_align (size
)
2099 while ((size
>>= 1) != 0)
2102 if (d30v_current_align
< log_size
)
2103 d30v_align (log_size
, (char *) NULL
, NULL
);
2104 else if (d30v_current_align
> log_size
)
2105 d30v_current_align
= log_size
;
2106 d30v_last_label
= NULL
;
2109 /* Called internally to handle all alignment needs. This takes care
2110 of eliding calls to frag_align if'n the cached current alignment
2111 says we've already got it, as well as taking care of the auto-aligning
2115 d30v_align (n
, pfill
, label
)
2120 /* The front end is prone to changing segments out from under us
2121 temporarily when -g is in effect. */
2122 int switched_seg_p
= (d30v_current_align_seg
!= now_seg
);
2124 /* Do not assume that if 'd30v_current_align >= n' and
2125 '! switched_seg_p' that it is safe to avoid performing
2126 this alignement request. The alignment of the current frag
2127 can be changed under our feet, for example by a .ascii
2128 directive in the source code. cf testsuite/gas/d30v/reloc.s */
2129 d30v_cleanup (false);
2134 && (bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
) != 0)
2136 static char const nop
[4] = { 0x00, 0xf0, 0x00, 0x00 };
2138 /* First, make sure we're on a four-byte boundary, in case
2139 someone has been putting .byte values the text section. */
2140 if (d30v_current_align
< 2 || switched_seg_p
)
2141 frag_align (2, 0, 0);
2142 frag_align_pattern (n
, nop
, sizeof nop
, 0);
2145 frag_align (n
, 0, 0);
2148 frag_align (n
, *pfill
, 0);
2150 if (!switched_seg_p
)
2151 d30v_current_align
= n
;
2156 int label_seen
= false;
2157 struct frag
*old_frag
;
2161 assert (S_GET_SEGMENT (label
) == now_seg
);
2163 old_frag
= symbol_get_frag (label
);
2164 old_value
= S_GET_VALUE (label
);
2165 new_value
= (valueT
) frag_now_fix ();
2167 /* It is possible to have more than one label at a particular
2168 address, especially if debugging is enabled, so we must
2169 take care to adjust all the labels at this address in this
2170 fragment. To save time we search from the end of the symbol
2171 list, backwards, since the symbols we are interested in are
2172 almost certainly the ones that were most recently added.
2173 Also to save time we stop searching once we have seen at least
2174 one matching label, and we encounter a label that is no longer
2175 in the target fragment. Note, this search is guaranteed to
2176 find at least one match when sym == label, so no special case
2177 code is necessary. */
2178 for (sym
= symbol_lastP
; sym
!= NULL
; sym
= symbol_previous (sym
))
2180 if (symbol_get_frag (sym
) == old_frag
2181 && S_GET_VALUE (sym
) == old_value
)
2184 symbol_set_frag (sym
, frag_now
);
2185 S_SET_VALUE (sym
, new_value
);
2187 else if (label_seen
&& symbol_get_frag (sym
) != old_frag
)
2192 record_alignment (now_seg
, n
);
2195 /* Handle the .align pseudo-op. This aligns to a power of two. We
2196 hook here to latch the current alignment. */
2199 s_d30v_align (ignore
)
2203 char fill
, *pfill
= NULL
;
2204 long max_alignment
= 15;
2206 align
= get_absolute_expression ();
2207 if (align
> max_alignment
)
2209 align
= max_alignment
;
2210 as_warn (_("Alignment too large: %d assumed"), align
);
2214 as_warn (_("Alignment negative: 0 assumed"));
2218 if (*input_line_pointer
== ',')
2220 input_line_pointer
++;
2221 fill
= get_absolute_expression ();
2225 d30v_last_label
= NULL
;
2226 d30v_align (align
, pfill
, NULL
);
2228 demand_empty_rest_of_line ();
2231 /* Handle the .text pseudo-op. This is like the usual one, but it
2232 clears the saved last label and resets known alignment. */
2240 d30v_last_label
= NULL
;
2241 d30v_current_align
= 0;
2242 d30v_current_align_seg
= now_seg
;
2245 /* Handle the .data pseudo-op. This is like the usual one, but it
2246 clears the saved last label and resets known alignment. */
2253 d30v_last_label
= NULL
;
2254 d30v_current_align
= 0;
2255 d30v_current_align_seg
= now_seg
;
2258 /* Handle the .section pseudo-op. This is like the usual one, but it
2259 clears the saved last label and resets known alignment. */
2262 s_d30v_section (ignore
)
2265 obj_elf_section (ignore
);
2266 d30v_last_label
= NULL
;
2267 d30v_current_align
= 0;
2268 d30v_current_align_seg
= now_seg
;