1 /* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007
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 3, 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, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, 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
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 struct option md_longopts
[] =
115 {NULL
, no_argument
, NULL
, 0}
118 size_t md_longopts_size
= sizeof (md_longopts
);
120 /* Opcode hash table. */
121 static struct hash_control
*d30v_hash
;
123 /* Do a binary search of the pre_defined_registers array to see if
124 NAME is a valid regiter name. Return the register number from the
125 array on success, or -1 on failure. */
128 reg_name_search (char *name
)
130 int middle
, low
, high
;
134 high
= reg_name_cnt () - 1;
138 middle
= (low
+ high
) / 2;
139 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
146 if (symbol_find (name
) != NULL
)
148 if (warn_register_name_conflicts
)
149 as_warn (_("Register name %s conflicts with symbol of the same name"),
153 return pre_defined_registers
[middle
].value
;
161 /* Check the string at input_line_pointer to see if it is a valid
165 register_name (expressionS
*expressionP
)
168 char c
, *p
= input_line_pointer
;
170 while (*p
&& *p
!= '\n' && *p
!= '\r' && *p
!= ',' && *p
!= ' ' && *p
!= ')')
177 /* Look to see if it's in the register table. */
178 reg_number
= reg_name_search (input_line_pointer
);
181 expressionP
->X_op
= O_register
;
182 /* Temporarily store a pointer to the string here. */
183 expressionP
->X_op_symbol
= (symbolS
*) input_line_pointer
;
184 expressionP
->X_add_number
= reg_number
;
185 input_line_pointer
= p
;
194 check_range (unsigned long num
, int bits
, int flags
)
198 /* Don't bother checking 32-bit values. */
201 if (sizeof (unsigned long) * CHAR_BIT
== 32)
204 /* We don't record signed or unsigned for 32-bit quantities.
206 min
= -((unsigned long) 1 << (bits
- 1));
207 max
= ((unsigned long) 1 << bits
) - 1;
208 return (long) num
< min
|| (long) num
> max
;
211 if (flags
& OPERAND_SHIFT
)
213 /* We know that all shifts are right by three bits. */
216 if (flags
& OPERAND_SIGNED
)
218 unsigned long sign_bit
= ((unsigned long) -1L >> 4) + 1;
219 num
= (num
^ sign_bit
) - sign_bit
;
223 if (flags
& OPERAND_SIGNED
)
225 max
= ((unsigned long) 1 << (bits
- 1)) - 1;
226 min
= - ((unsigned long) 1 << (bits
- 1));
227 return (long) num
> max
|| (long) num
< min
;
231 max
= ((unsigned long) 1 << bits
) - 1;
232 return num
> (unsigned long) max
;
237 md_show_usage (FILE *stream
)
239 fprintf (stream
, _("\nD30V options:\n\
240 -O Make adjacent short instructions parallel if possible.\n\
241 -n Warn about all NOPs inserted by the assembler.\n\
242 -N Warn about NOPs inserted after word multiplies.\n\
243 -c Warn about symbols whoes names match register names.\n\
244 -C Opposite of -C. -c is the default.\n"));
248 md_parse_option (int c
, char *arg ATTRIBUTE_UNUSED
)
252 /* Optimize. Will attempt to parallelize operations. */
257 /* Warn about all NOPS that the assembler inserts. */
262 /* Warn about the NOPS that the assembler inserts because of the
265 warn_nops
= NOP_MULTIPLY
;
269 warn_register_name_conflicts
= 1;
273 warn_register_name_conflicts
= 0;
283 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
288 /* Turn a string in input_line_pointer into a floating point constant
289 of type TYPE, and store the appropriate bytes in *LITP. The number
290 of LITTLENUMS emitted is stored in *SIZEP. An error message is
291 returned, or NULL on OK. */
294 md_atof (int type
, char *litP
, int *sizeP
)
297 LITTLENUM_TYPE words
[4];
311 return _("bad call to md_atof");
314 t
= atof_ieee (input_line_pointer
, type
, words
);
316 input_line_pointer
= t
;
320 for (i
= 0; i
< prec
; i
++)
322 md_number_to_chars (litP
, (valueT
) words
[i
], 2);
329 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
330 asection
*sec ATTRIBUTE_UNUSED
,
331 fragS
*fragP ATTRIBUTE_UNUSED
)
337 md_section_align (asection
*seg
, valueT addr
)
339 int align
= bfd_get_section_alignment (stdoutput
, seg
);
340 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
346 struct d30v_opcode
*opcode
;
347 d30v_hash
= hash_new ();
349 /* Insert opcode names into a hash table. */
350 for (opcode
= (struct d30v_opcode
*) d30v_opcode_table
; opcode
->name
; opcode
++)
351 hash_insert (d30v_hash
, opcode
->name
, (char *) opcode
);
354 FixUps
[0].next
= &FixUps
[1];
355 FixUps
[1].next
= &FixUps
[0];
357 d30v_current_align_seg
= now_seg
;
360 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
361 from an expression. */
366 while (*p
!= '-' && *p
!= '+')
368 if (*p
== 0 || *p
== '\n' || *p
== '\r' || *p
== ' ' || *p
== ',')
388 static bfd_reloc_code_real_type
389 get_reloc (struct d30v_operand
*op
, int rel_flag
)
394 if (op
->flags
& OPERAND_SHIFT
)
395 return BFD_RELOC_D30V_9_PCREL
;
397 return BFD_RELOC_D30V_6
;
400 if (!(op
->flags
& OPERAND_SHIFT
))
401 as_warn (_("unexpected 12-bit reloc type"));
402 if (rel_flag
== RELOC_PCREL
)
403 return BFD_RELOC_D30V_15_PCREL
;
405 return BFD_RELOC_D30V_15
;
407 if (!(op
->flags
& OPERAND_SHIFT
))
408 as_warn (_("unexpected 18-bit reloc type"));
409 if (rel_flag
== RELOC_PCREL
)
410 return BFD_RELOC_D30V_21_PCREL
;
412 return BFD_RELOC_D30V_21
;
414 if (rel_flag
== RELOC_PCREL
)
415 return BFD_RELOC_D30V_32_PCREL
;
417 return BFD_RELOC_D30V_32
;
423 /* Parse a string of operands and return an array of expressions. */
426 get_operands (expressionS exp
[], int cmp_hack
)
428 char *p
= input_line_pointer
;
434 exp
[numops
].X_op
= O_absent
;
435 exp
[numops
++].X_add_number
= cmp_hack
- 1;
440 while (*p
== ' ' || *p
== '\t' || *p
== ',')
443 if (*p
== 0 || *p
== '\n' || *p
== '\r')
449 exp
[numops
].X_op
= O_absent
;
453 exp
[numops
].X_add_number
= OPERAND_ATPAR
;
459 exp
[numops
].X_add_number
= OPERAND_ATMINUS
;
463 exp
[numops
].X_add_number
= OPERAND_ATSIGN
;
472 /* Just skip the trailing paren. */
477 input_line_pointer
= p
;
479 /* Check to see if it might be a register name. */
480 if (!register_name (&exp
[numops
]))
482 /* Parse as an expression. */
483 expression (&exp
[numops
]);
486 if (exp
[numops
].X_op
== O_illegal
)
487 as_bad (_("illegal operand"));
488 else if (exp
[numops
].X_op
== O_absent
)
489 as_bad (_("missing operand"));
492 p
= input_line_pointer
;
497 /* Postdecrement mode. */
498 exp
[numops
].X_op
= O_absent
;
499 exp
[numops
++].X_add_number
= OPERAND_MINUS
;
502 /* Postincrement mode. */
503 exp
[numops
].X_op
= O_absent
;
504 exp
[numops
++].X_add_number
= OPERAND_PLUS
;
510 exp
[numops
].X_op
= 0;
515 /* Generate the instruction.
516 It does everything but write the FM bits. */
519 build_insn (struct d30v_insn
*opcode
, expressionS
*opers
)
521 int i
, length
, bits
, shift
, flags
;
522 unsigned long number
, id
= 0;
524 struct d30v_opcode
*op
= opcode
->op
;
525 struct d30v_format
*form
= opcode
->form
;
528 opcode
->ecc
<< 28 | op
->op1
<< 25 | op
->op2
<< 20 | form
->modifier
<< 18;
530 for (i
= 0; form
->operands
[i
]; i
++)
532 flags
= d30v_operand_table
[form
->operands
[i
]].flags
;
534 /* Must be a register or number. */
535 if (!(flags
& OPERAND_REG
) && !(flags
& OPERAND_NUM
)
536 && !(flags
& OPERAND_NAME
) && !(flags
& OPERAND_SPECIAL
))
539 bits
= d30v_operand_table
[form
->operands
[i
]].bits
;
540 if (flags
& OPERAND_SHIFT
)
543 length
= d30v_operand_table
[form
->operands
[i
]].length
;
544 shift
= 12 - d30v_operand_table
[form
->operands
[i
]].position
;
545 if (opers
[i
].X_op
!= O_symbol
)
546 number
= opers
[i
].X_add_number
;
549 if (flags
& OPERAND_REG
)
551 /* Check for mvfsys or mvtsys control registers. */
552 if (flags
& OPERAND_CONTROL
&& (number
& 0x7f) > MAX_CONTROL_REG
)
555 id
= (number
& 0x7f) - MAX_CONTROL_REG
;
558 else if (number
& OPERAND_FLAG
)
559 /* NUMBER is a flag register. */
564 else if (flags
& OPERAND_SPECIAL
)
567 if (opers
[i
].X_op
!= O_register
&& opers
[i
].X_op
!= O_constant
568 && !(flags
& OPERAND_NAME
))
570 /* Now create a fixup. */
571 if (fixups
->fc
>= MAX_INSN_FIXUPS
)
572 as_fatal (_("too many fixups"));
574 fixups
->fix
[fixups
->fc
].reloc
=
575 get_reloc ((struct d30v_operand
*) &d30v_operand_table
[form
->operands
[i
]], op
->reloc_flag
);
576 fixups
->fix
[fixups
->fc
].size
= 4;
577 fixups
->fix
[fixups
->fc
].exp
= opers
[i
];
578 fixups
->fix
[fixups
->fc
].operand
= form
->operands
[i
];
579 if (fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_D30V_9_PCREL
)
580 fixups
->fix
[fixups
->fc
].pcrel
= RELOC_PCREL
;
582 fixups
->fix
[fixups
->fc
].pcrel
= op
->reloc_flag
;
586 /* Truncate to the proper number of bits. */
587 if ((opers
[i
].X_op
== O_constant
) && check_range (number
, bits
, flags
))
588 as_bad (_("operand out of range: %ld"), number
);
590 number
&= 0x7FFFFFFF >> (31 - bits
);
591 if (flags
& OPERAND_SHIFT
)
595 /* It's a LONG instruction. */
596 insn
|= ((number
& 0xffffffff) >> 26); /* Top 6 bits. */
597 insn
<<= 32; /* Shift the first word over. */
598 insn
|= ((number
& 0x03FC0000) << 2); /* Next 8 bits. */
599 insn
|= number
& 0x0003FFFF; /* Bottom 18 bits. */
602 insn
|= number
<< shift
;
609 d30v_number_to_chars (char *buf
, /* Return 'nbytes' of chars here. */
610 long long value
, /* The value of the bits. */
611 int n
) /* Number of bytes in the output. */
615 buf
[n
] = value
& 0xff;
620 /* Write out a long form instruction. */
623 write_long (struct d30v_insn
*opcode ATTRIBUTE_UNUSED
,
628 char *f
= frag_more (8);
631 d30v_number_to_chars (f
, insn
, 8);
633 for (i
= 0; i
< fx
->fc
; i
++)
635 if (fx
->fix
[i
].reloc
)
637 where
= f
- frag_now
->fr_literal
;
638 fix_new_exp (frag_now
, where
, fx
->fix
[i
].size
, &(fx
->fix
[i
].exp
),
639 fx
->fix
[i
].pcrel
, fx
->fix
[i
].reloc
);
646 /* Write out a short form instruction by itself. */
649 write_1_short (struct d30v_insn
*opcode
,
654 char *f
= frag_more (8);
657 if (warn_nops
== NOP_ALL
)
658 as_warn (_("%s NOP inserted"), use_sequential
?
659 _("sequential") : _("parallel"));
661 /* The other container needs to be NOP. */
664 /* Use a sequential NOP rather than a parallel one,
665 as the current instruction is a FLAG_MUL32 type one
666 and the next instruction is a load. */
668 /* According to 4.3.1: for FM=01, sub-instructions performed
669 only by IU cannot be encoded in L-container. */
670 if (opcode
->op
->unit
== IU
)
671 /* Right then left. */
672 insn
|= FM10
| NOP_LEFT
;
674 /* Left then right. */
675 insn
= FM01
| (insn
<< 32) | NOP_RIGHT
;
679 /* According to 4.3.1: for FM=00, sub-instructions performed
680 only by IU cannot be encoded in L-container. */
681 if (opcode
->op
->unit
== IU
)
682 /* Right container. */
683 insn
|= FM00
| NOP_LEFT
;
685 /* Left container. */
686 insn
= FM00
| (insn
<< 32) | NOP_RIGHT
;
689 d30v_number_to_chars (f
, insn
, 8);
691 for (i
= 0; i
< fx
->fc
; i
++)
693 if (fx
->fix
[i
].reloc
)
695 where
= f
- frag_now
->fr_literal
;
696 fix_new_exp (frag_now
,
708 /* Check 2 instructions and determine if they can be safely
709 executed in parallel. Return 1 if they can be. */
712 parallel_ok (struct d30v_insn
*op1
,
714 struct d30v_insn
*op2
,
716 exec_type_enum exec_type
)
718 int i
, j
, shift
, regno
, bits
, ecc
;
719 unsigned long flags
, mask
, flags_set1
, flags_set2
, flags_used1
, flags_used2
;
720 unsigned long ins
, mod_reg
[2][3], used_reg
[2][3], flag_reg
[2];
721 struct d30v_format
*f
;
722 struct d30v_opcode
*op
;
724 /* Section 4.3: Both instructions must not be IU or MU only. */
725 if ((op1
->op
->unit
== IU
&& op2
->op
->unit
== IU
)
726 || (op1
->op
->unit
== MU
&& op2
->op
->unit
== MU
))
729 /* First instruction must not be a jump to safely optimize, unless this
730 is an explicit parallel operation. */
731 if (exec_type
!= EXEC_PARALLEL
732 && (op1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
)))
735 /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
736 then it is safe to allow the two to be done as parallel ops, since only
737 one will ever be executed at a time. */
738 if ((op1
->ecc
== ECC_TX
&& op2
->ecc
== ECC_FX
)
739 || (op1
->ecc
== ECC_FX
&& op2
->ecc
== ECC_TX
)
740 || (op1
->ecc
== ECC_XT
&& op2
->ecc
== ECC_XF
)
741 || (op1
->ecc
== ECC_XF
&& op2
->ecc
== ECC_XT
))
746 [2] a0, a1, flag registers. */
747 for (j
= 0; j
< 2; j
++)
765 mod_reg
[j
][0] = mod_reg
[j
][1] = 0;
766 used_reg
[j
][0] = used_reg
[j
][1] = 0;
768 if (flag_explicitly_parallel
)
770 /* For human specified parallel instructions we have been asked
771 to ignore the possibility that both instructions could modify
772 bits in the PSW, so we initialise the mod & used arrays to 0.
773 We have been asked, however, to refuse to allow parallel
774 instructions which explicitly set the same flag register,
775 eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
776 for the use of a flag register and set a bit in the mod or used
777 array appropriately. */
783 mod_reg
[j
][2] = (op
->flags_set
& FLAG_ALL
);
784 used_reg
[j
][2] = (op
->flags_used
& FLAG_ALL
);
787 /* BSR/JSR always sets R62. */
788 if (op
->flags_used
& FLAG_JSR
)
789 mod_reg
[j
][1] = (1L << (62 - 32));
791 /* Conditional execution affects the flags_used. */
796 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_0
;
801 used_reg
[j
][2] |= flag_reg
[j
] = FLAG_1
;
806 used_reg
[j
][2] |= flag_reg
[j
] = (FLAG_0
| FLAG_1
);
810 for (i
= 0; f
->operands
[i
]; i
++)
812 flags
= d30v_operand_table
[f
->operands
[i
]].flags
;
813 shift
= 12 - d30v_operand_table
[f
->operands
[i
]].position
;
814 bits
= d30v_operand_table
[f
->operands
[i
]].bits
;
818 mask
= 0x7FFFFFFF >> (31 - bits
);
820 if ((flags
& OPERAND_PLUS
) || (flags
& OPERAND_MINUS
))
822 /* This is a post-increment or post-decrement.
823 The previous register needs to be marked as modified. */
824 shift
= 12 - d30v_operand_table
[f
->operands
[i
- 1]].position
;
825 regno
= (ins
>> shift
) & 0x3f;
827 mod_reg
[j
][1] |= 1L << (regno
- 32);
829 mod_reg
[j
][0] |= 1L << regno
;
831 else if (flags
& OPERAND_REG
)
833 regno
= (ins
>> shift
) & mask
;
834 /* The memory write functions don't have a destination
836 if ((flags
& OPERAND_DEST
) && !(op
->flags_set
& FLAG_MEM
))
838 /* MODIFIED registers and flags. */
839 if (flags
& OPERAND_ACC
)
842 mod_reg
[j
][2] |= FLAG_A0
;
844 mod_reg
[j
][2] |= FLAG_A1
;
848 else if (flags
& OPERAND_FLAG
)
849 mod_reg
[j
][2] |= 1L << regno
;
850 else if (!(flags
& OPERAND_CONTROL
))
854 /* Need to check if there are two destination
855 registers, for example ld2w. */
856 if (flags
& OPERAND_2REG
)
861 for (r
= regno
; r
<= regno
+ z
; r
++)
864 mod_reg
[j
][1] |= 1L << (r
- 32);
866 mod_reg
[j
][0] |= 1L << r
;
872 /* USED, but not modified registers and flags. */
873 if (flags
& OPERAND_ACC
)
876 used_reg
[j
][2] |= FLAG_A0
;
878 used_reg
[j
][2] |= FLAG_A1
;
882 else if (flags
& OPERAND_FLAG
)
883 used_reg
[j
][2] |= 1L << regno
;
884 else if (!(flags
& OPERAND_CONTROL
))
888 /* Need to check if there are two source
889 registers, for example st2w. */
890 if (flags
& OPERAND_2REG
)
895 for (r
= regno
; r
<= regno
+ z
; r
++)
898 used_reg
[j
][1] |= 1L << (r
- 32);
900 used_reg
[j
][0] |= 1L << r
;
908 flags_set1
= op1
->op
->flags_set
;
909 flags_set2
= op2
->op
->flags_set
;
910 flags_used1
= op1
->op
->flags_used
;
911 flags_used2
= op2
->op
->flags_used
;
913 /* Check for illegal combinations with ADDppp/SUBppp. */
914 if (((flags_set1
& FLAG_NOT_WITH_ADDSUBppp
) != 0
915 && (flags_used2
& FLAG_ADDSUBppp
) != 0)
916 || ((flags_set2
& FLAG_NOT_WITH_ADDSUBppp
) != 0
917 && (flags_used1
& FLAG_ADDSUBppp
) != 0))
920 /* Load instruction combined with half-word multiply is illegal. */
921 if (((flags_used1
& FLAG_MEM
) != 0 && (flags_used2
& FLAG_MUL16
))
922 || ((flags_used2
& FLAG_MEM
) != 0 && (flags_used1
& FLAG_MUL16
)))
925 /* Specifically allow add || add by removing carry, overflow bits dependency.
926 This is safe, even if an addc follows since the IU takes the argument in
927 the right container, and it writes its results last.
928 However, don't paralellize add followed by addc or sub followed by
930 if (mod_reg
[0][2] == FLAG_CVVA
&& mod_reg
[1][2] == FLAG_CVVA
931 && (used_reg
[0][2] & ~flag_reg
[0]) == 0
932 && (used_reg
[1][2] & ~flag_reg
[1]) == 0
933 && op1
->op
->unit
== EITHER
&& op2
->op
->unit
== EITHER
)
935 mod_reg
[0][2] = mod_reg
[1][2] = 0;
938 for (j
= 0; j
< 3; j
++)
940 /* If the second instruction depends on the first, we obviously
941 cannot parallelize. Note, the mod flag implies use, so
942 check that as well. */
943 /* If flag_explicitly_parallel is set, then the case of the
944 second instruction using a register the first instruction
945 modifies is assumed to be okay; we trust the human. We
946 don't trust the human if both instructions modify the same
947 register but we do trust the human if they modify the same
949 /* We have now been requested not to trust the human if the
950 instructions modify the same flag registers either. */
951 if (flag_explicitly_parallel
)
953 if ((mod_reg
[0][j
] & mod_reg
[1][j
]) != 0)
957 if ((mod_reg
[0][j
] & (mod_reg
[1][j
] | used_reg
[1][j
])) != 0)
964 /* Write out a short form instruction if possible.
965 Return number of instructions not written out. */
968 write_2_short (struct d30v_insn
*opcode1
,
970 struct d30v_insn
*opcode2
,
972 exec_type_enum exec_type
,
975 long long insn
= NOP2
;
979 if (exec_type
== EXEC_SEQ
980 && (opcode1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
))
981 && ((opcode1
->op
->flags_used
& FLAG_DELAY
) == 0)
982 && ((opcode1
->ecc
== ECC_AL
) || ! Optimizing
))
984 /* Unconditional, non-delayed branches kill instructions in
985 the right bin. Conditional branches don't always but if
986 we are not optimizing, then we have been asked to produce
987 an error about such constructs. For the purposes of this
988 test, subroutine calls are considered to be branches. */
989 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
993 /* Note: we do not have to worry about subroutine calls occurring
994 in the right hand container. The return address is always
995 aligned to the next 64 bit boundary, be that 64 or 32 bit away. */
998 case EXEC_UNKNOWN
: /* Order not specified. */
1000 && parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
)
1001 && ! ( (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
1002 || opcode1
->op
->unit
== MU
)
1004 ( opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
1005 || opcode2
->op
->unit
== MU
)))
1008 exec_type
= EXEC_PARALLEL
;
1010 if (opcode1
->op
->unit
== IU
1011 || opcode2
->op
->unit
== MU
1012 || opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
1013 insn
= FM00
| (insn2
<< 32) | insn1
;
1016 insn
= FM00
| (insn1
<< 32) | insn2
;
1020 else if ((opcode1
->op
->flags_used
& (FLAG_JMP
| FLAG_JSR
)
1021 && ((opcode1
->op
->flags_used
& FLAG_DELAY
) == 0))
1022 || opcode1
->op
->flags_used
& FLAG_RP
)
1024 /* We must emit (non-delayed) branch type instructions
1025 on their own with nothing in the right container. */
1026 /* We must treat repeat instructions likewise, since the
1027 following instruction has to be separate from the repeat
1028 in order to be repeated. */
1029 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
1032 else if (prev_left_kills_right_p
)
1034 /* The left instruction kils the right slot, so we
1035 must leave it empty. */
1036 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
1039 else if (opcode1
->op
->unit
== IU
)
1041 if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
1043 /* Case 103810 is a request from Mitsubishi that opcodes
1044 with EITHER_BUT_PREFER_MU should not be executed in
1045 reverse sequential order. */
1046 write_1_short (opcode1
, insn1
, fx
->next
, FALSE
);
1050 /* Reverse sequential. */
1051 insn
= FM10
| (insn2
<< 32) | insn1
;
1052 exec_type
= EXEC_REVSEQ
;
1057 insn
= FM01
| (insn1
<< 32) | insn2
;
1059 exec_type
= EXEC_SEQ
;
1063 case EXEC_PARALLEL
: /* Parallel. */
1064 flag_explicitly_parallel
= flag_xp_state
;
1065 if (! parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
))
1066 as_bad (_("Instructions may not be executed in parallel"));
1067 else if (opcode1
->op
->unit
== IU
)
1069 if (opcode2
->op
->unit
== IU
)
1070 as_bad (_("Two IU instructions may not be executed in parallel"));
1071 as_warn (_("Swapping instruction order"));
1072 insn
= FM00
| (insn2
<< 32) | insn1
;
1074 else if (opcode2
->op
->unit
== MU
)
1076 if (opcode1
->op
->unit
== MU
)
1077 as_bad (_("Two MU instructions may not be executed in parallel"));
1078 else if (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
)
1079 as_warn (_("Executing %s in IU may not work"), opcode1
->op
->name
);
1080 as_warn (_("Swapping instruction order"));
1081 insn
= FM00
| (insn2
<< 32) | insn1
;
1085 if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
1086 as_warn (_("Executing %s in IU may not work in parallel execution"),
1089 insn
= FM00
| (insn1
<< 32) | insn2
;
1092 flag_explicitly_parallel
= 0;
1095 case EXEC_SEQ
: /* Sequential. */
1096 if (opcode1
->op
->unit
== IU
)
1097 as_bad (_("IU instruction may not be in the left container"));
1098 if (prev_left_kills_right_p
)
1099 as_bad (_("special left instruction `%s' kills instruction "
1100 "`%s' in right container"),
1101 opcode1
->op
->name
, opcode2
->op
->name
);
1102 insn
= FM01
| (insn1
<< 32) | insn2
;
1106 case EXEC_REVSEQ
: /* Reverse sequential. */
1107 if (opcode2
->op
->unit
== MU
)
1108 as_bad (_("MU instruction may not be in the right container"));
1109 if (opcode1
->op
->unit
== EITHER_BUT_PREFER_MU
)
1110 as_warn (_("Executing %s in reverse serial with %s may not work"),
1111 opcode1
->op
->name
, opcode2
->op
->name
);
1112 else if (opcode2
->op
->unit
== EITHER_BUT_PREFER_MU
)
1113 as_warn (_("Executing %s in IU in reverse serial may not work"),
1115 insn
= FM10
| (insn1
<< 32) | insn2
;
1120 as_fatal (_("unknown execution type passed to write_2_short()"));
1124 d30v_number_to_chars (f
, insn
, 8);
1126 /* If the previous instruction was a 32-bit multiply but it is put into a
1127 parallel container, mark the current instruction as being a 32-bit
1129 if (prev_mul32_p
&& exec_type
== EXEC_PARALLEL
)
1132 for (j
= 0; j
< 2; j
++)
1134 for (i
= 0; i
< fx
->fc
; i
++)
1136 if (fx
->fix
[i
].reloc
)
1138 where
= (f
- frag_now
->fr_literal
) + 4 * j
;
1140 fix_new_exp (frag_now
,
1156 /* Get a pointer to an entry in the format table.
1157 It must look at all formats for an opcode and use the operands
1158 to choose the correct one. Return NULL on error. */
1160 static struct d30v_format
*
1161 find_format (struct d30v_opcode
*opcode
,
1162 expressionS myops
[],
1166 int numops
, match
, index
, i
= 0, j
, k
;
1167 struct d30v_format
*fm
;
1172 /* Get all the operands and save them as expressions. */
1173 numops
= get_operands (myops
, cmp_hack
);
1175 while ((index
= opcode
->format
[i
++]) != 0)
1177 if (fsize
== FORCE_SHORT
&& index
>= LONG
)
1180 if (fsize
== FORCE_LONG
&& index
< LONG
)
1183 fm
= (struct d30v_format
*) &d30v_format_table
[index
];
1185 while (fm
->form
== index
)
1188 /* Now check the operands for compatibility. */
1189 for (j
= 0; match
&& fm
->operands
[j
]; j
++)
1191 int flags
= d30v_operand_table
[fm
->operands
[j
]].flags
;
1192 int bits
= d30v_operand_table
[fm
->operands
[j
]].bits
;
1193 int X_op
= myops
[j
].X_op
;
1194 int num
= myops
[j
].X_add_number
;
1196 if (flags
& OPERAND_SPECIAL
)
1198 else if (X_op
== O_illegal
)
1200 else if (flags
& OPERAND_REG
)
1202 if (X_op
!= O_register
1203 || ((flags
& OPERAND_ACC
) && !(num
& OPERAND_ACC
))
1204 || (!(flags
& OPERAND_ACC
) && (num
& OPERAND_ACC
))
1205 || ((flags
& OPERAND_FLAG
) && !(num
& OPERAND_FLAG
))
1206 || (!(flags
& (OPERAND_FLAG
| OPERAND_CONTROL
)) && (num
& OPERAND_FLAG
))
1207 || ((flags
& OPERAND_CONTROL
)
1208 && !(num
& (OPERAND_CONTROL
| OPERAND_FLAG
))))
1211 else if (((flags
& OPERAND_MINUS
)
1212 && (X_op
!= O_absent
|| num
!= OPERAND_MINUS
))
1213 || ((flags
& OPERAND_PLUS
)
1214 && (X_op
!= O_absent
|| num
!= OPERAND_PLUS
))
1215 || ((flags
& OPERAND_ATMINUS
)
1216 && (X_op
!= O_absent
|| num
!= OPERAND_ATMINUS
))
1217 || ((flags
& OPERAND_ATPAR
)
1218 && (X_op
!= O_absent
|| num
!= OPERAND_ATPAR
))
1219 || ((flags
& OPERAND_ATSIGN
)
1220 && (X_op
!= O_absent
|| num
!= OPERAND_ATSIGN
)))
1222 else if (flags
& OPERAND_NUM
)
1224 /* A number can be a constant or symbol expression. */
1226 /* If we have found a register name, but that name
1227 also matches a symbol, then re-parse the name as
1229 if (X_op
== O_register
1230 && symbol_find ((char *) myops
[j
].X_op_symbol
))
1232 input_line_pointer
= (char *) myops
[j
].X_op_symbol
;
1233 expression (&myops
[j
]);
1236 /* Turn an expression into a symbol for later resolution. */
1237 if (X_op
!= O_absent
&& X_op
!= O_constant
1238 && X_op
!= O_symbol
&& X_op
!= O_register
1241 symbolS
*sym
= make_expr_symbol (&myops
[j
]);
1242 myops
[j
].X_op
= X_op
= O_symbol
;
1243 myops
[j
].X_add_symbol
= sym
;
1244 myops
[j
].X_add_number
= num
= 0;
1247 if (fm
->form
>= LONG
)
1249 /* If we're testing for a LONG format, either fits. */
1250 if (X_op
!= O_constant
&& X_op
!= O_symbol
)
1253 else if (fm
->form
< LONG
1254 && ((fsize
== FORCE_SHORT
&& X_op
== O_symbol
)
1255 || (fm
->form
== SHORT_D2
&& j
== 0)))
1258 /* This is the tricky part. Will the constant or symbol
1259 fit into the space in the current format? */
1260 else if (X_op
== O_constant
)
1262 if (check_range (num
, bits
, flags
))
1265 else if (X_op
== O_symbol
1266 && S_IS_DEFINED (myops
[j
].X_add_symbol
)
1267 && S_GET_SEGMENT (myops
[j
].X_add_symbol
) == now_seg
1268 && opcode
->reloc_flag
== RELOC_PCREL
)
1270 /* If the symbol is defined, see if the value will fit
1271 into the form we're considering. */
1275 /* Calculate the current address by running through the
1276 previous frags and adding our current offset. */
1278 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1279 value
+= f
->fr_fix
+ f
->fr_offset
;
1280 value
= (S_GET_VALUE (myops
[j
].X_add_symbol
) - value
1281 - (obstack_next_free (&frchain_now
->frch_obstack
)
1282 - frag_now
->fr_literal
));
1283 if (check_range (value
, bits
, flags
))
1290 /* We're only done if the operands matched so far AND there
1291 are no more to check. */
1292 if (match
&& myops
[j
].X_op
== 0)
1294 /* Final check - issue a warning if an odd numbered register
1295 is used as the first register in an instruction that reads
1296 or writes 2 registers. */
1298 for (j
= 0; fm
->operands
[j
]; j
++)
1299 if (myops
[j
].X_op
== O_register
1300 && (myops
[j
].X_add_number
& 1)
1301 && (d30v_operand_table
[fm
->operands
[j
]].flags
& OPERAND_2REG
))
1302 as_warn (_("Odd numbered register used as target of multi-register instruction"));
1306 fm
= (struct d30v_format
*) &d30v_format_table
[++k
];
1312 /* Assemble a single instruction and return an opcode.
1313 Return -1 (an invalid opcode) on error. */
1315 #define NAME_BUF_LEN 20
1318 do_assemble (char *str
,
1319 struct d30v_insn
*opcode
,
1326 char name
[NAME_BUF_LEN
];
1329 int fsize
= (shortp
? FORCE_SHORT
: 0);
1330 expressionS myops
[6];
1333 /* Drop leading whitespace. */
1337 /* Find the opcode end. */
1338 for (op_start
= op_end
= str
;
1340 && nlen
< (NAME_BUF_LEN
- 1)
1342 && !is_end_of_line
[(unsigned char) *op_end
] && *op_end
!= ' ';
1345 name
[nlen
] = TOLOWER (op_start
[nlen
]);
1354 /* If there is an execution condition code, handle it. */
1358 while ((i
< ECC_MAX
) && strncasecmp (d30v_ecc_names
[i
], op_end
+ 1, 2))
1364 strncpy (tmp
, op_end
+ 1, 2);
1366 as_bad (_("unknown condition code: %s"), tmp
);
1373 opcode
->ecc
= ECC_AL
;
1375 /* CMP and CMPU change their name based on condition codes. */
1376 if (!strncmp (name
, "cmp", 3))
1379 char **str
= (char **) d30v_cc_names
;
1385 for (i
= 1; *str
&& strncmp (*str
, &name
[p
], 2); i
++, str
++)
1388 /* cmpu only supports some condition codes. */
1394 as_bad (_("cmpu doesn't support condition code %s"), &name
[p
]);
1401 as_bad (_("unknown condition code: %s"), &name
[p
]);
1410 /* Need to look for .s or .l. */
1411 if (name
[nlen
- 2] == '.')
1413 switch (name
[nlen
- 1])
1416 fsize
= FORCE_SHORT
;
1425 /* Find the first opcode with the proper name. */
1426 opcode
->op
= (struct d30v_opcode
*) hash_find (d30v_hash
, name
);
1427 if (opcode
->op
== NULL
)
1429 as_bad (_("unknown opcode: %s"), name
);
1433 save
= input_line_pointer
;
1434 input_line_pointer
= op_end
;
1435 while (!(opcode
->form
= find_format (opcode
->op
, myops
, fsize
, cmp_hack
)))
1438 if (opcode
->op
->name
== NULL
|| strcmp (opcode
->op
->name
, name
))
1440 as_bad (_("operands for opcode `%s' do not match any valid format"),
1445 input_line_pointer
= save
;
1447 insn
= build_insn (opcode
, myops
);
1449 /* Propagate multiply status. */
1452 if (is_parallel
&& prev_mul32_p
)
1456 prev_mul32_p
= cur_mul32_p
;
1457 cur_mul32_p
= (opcode
->op
->flags_used
& FLAG_MUL32
) != 0;
1461 /* Propagate left_kills_right status. */
1464 prev_left_kills_right_p
= cur_left_kills_right_p
;
1466 if (opcode
->op
->flags_set
& FLAG_LKR
)
1468 cur_left_kills_right_p
= 1;
1470 if (strcmp (opcode
->op
->name
, "mvtsys") == 0)
1472 /* Left kills right for only mvtsys only for
1473 PSW/PSWH/PSWL/flags target. */
1474 if ((myops
[0].X_op
== O_register
) &&
1475 ((myops
[0].X_add_number
== OPERAND_CONTROL
) || /* psw */
1476 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+2) || /* pswh */
1477 (myops
[0].X_add_number
== OPERAND_CONTROL
+MAX_CONTROL_REG
+1) || /* pswl */
1478 (myops
[0].X_add_number
== OPERAND_FLAG
+0) || /* f0 */
1479 (myops
[0].X_add_number
== OPERAND_FLAG
+1) || /* f1 */
1480 (myops
[0].X_add_number
== OPERAND_FLAG
+2) || /* f2 */
1481 (myops
[0].X_add_number
== OPERAND_FLAG
+3) || /* f3 */
1482 (myops
[0].X_add_number
== OPERAND_FLAG
+4) || /* f4 */
1483 (myops
[0].X_add_number
== OPERAND_FLAG
+5) || /* f5 */
1484 (myops
[0].X_add_number
== OPERAND_FLAG
+6) || /* f6 */
1485 (myops
[0].X_add_number
== OPERAND_FLAG
+7))) /* f7 */
1487 cur_left_kills_right_p
= 1;
1491 /* Other mvtsys target registers don't kill right
1493 cur_left_kills_right_p
= 0;
1498 cur_left_kills_right_p
= 0;
1504 /* Called internally to handle all alignment needs. This takes care
1505 of eliding calls to frag_align if'n the cached current alignment
1506 says we've already got it, as well as taking care of the auto-aligning
1510 d30v_align (int n
, char *pfill
, symbolS
*label
)
1512 /* The front end is prone to changing segments out from under us
1513 temporarily when -g is in effect. */
1514 int switched_seg_p
= (d30v_current_align_seg
!= now_seg
);
1516 /* Do not assume that if 'd30v_current_align >= n' and
1517 '! switched_seg_p' that it is safe to avoid performing
1518 this alignment request. The alignment of the current frag
1519 can be changed under our feet, for example by a .ascii
1520 directive in the source code. cf testsuite/gas/d30v/reloc.s */
1521 d30v_cleanup (FALSE
);
1526 && (bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
) != 0)
1528 static char const nop
[4] = { 0x00, 0xf0, 0x00, 0x00 };
1530 /* First, make sure we're on a four-byte boundary, in case
1531 someone has been putting .byte values the text section. */
1532 if (d30v_current_align
< 2 || switched_seg_p
)
1533 frag_align (2, 0, 0);
1534 frag_align_pattern (n
, nop
, sizeof nop
, 0);
1537 frag_align (n
, 0, 0);
1540 frag_align (n
, *pfill
, 0);
1542 if (!switched_seg_p
)
1543 d30v_current_align
= n
;
1548 int label_seen
= FALSE
;
1549 struct frag
*old_frag
;
1553 assert (S_GET_SEGMENT (label
) == now_seg
);
1555 old_frag
= symbol_get_frag (label
);
1556 old_value
= S_GET_VALUE (label
);
1557 new_value
= (valueT
) frag_now_fix ();
1559 /* It is possible to have more than one label at a particular
1560 address, especially if debugging is enabled, so we must
1561 take care to adjust all the labels at this address in this
1562 fragment. To save time we search from the end of the symbol
1563 list, backwards, since the symbols we are interested in are
1564 almost certainly the ones that were most recently added.
1565 Also to save time we stop searching once we have seen at least
1566 one matching label, and we encounter a label that is no longer
1567 in the target fragment. Note, this search is guaranteed to
1568 find at least one match when sym == label, so no special case
1569 code is necessary. */
1570 for (sym
= symbol_lastP
; sym
!= NULL
; sym
= symbol_previous (sym
))
1572 if (symbol_get_frag (sym
) == old_frag
1573 && S_GET_VALUE (sym
) == old_value
)
1576 symbol_set_frag (sym
, frag_now
);
1577 S_SET_VALUE (sym
, new_value
);
1579 else if (label_seen
&& symbol_get_frag (sym
) != old_frag
)
1584 record_alignment (now_seg
, n
);
1587 /* This is the main entry point for the machine-dependent assembler.
1588 STR points to a machine-dependent instruction. This function is
1589 supposed to emit the frags/bytes it assembles to. For the D30V, it
1590 mostly handles the special VLIW parsing and packing and leaves the
1591 difficult stuff to do_assemble (). */
1593 static long long prev_insn
= -1;
1594 static struct d30v_insn prev_opcode
;
1595 static subsegT prev_subseg
;
1596 static segT prev_seg
= 0;
1599 md_assemble (char *str
)
1601 struct d30v_insn opcode
;
1603 /* Execution type; parallel, etc. */
1604 exec_type_enum extype
= EXEC_UNKNOWN
;
1605 /* Saved extype. Used for multiline instructions. */
1606 static exec_type_enum etype
= EXEC_UNKNOWN
;
1609 if ((prev_insn
!= -1) && prev_seg
1610 && ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1611 d30v_cleanup (FALSE
);
1613 if (d30v_current_align
< 3)
1614 d30v_align (3, NULL
, d30v_last_label
);
1615 else if (d30v_current_align
> 3)
1616 d30v_current_align
= 3;
1617 d30v_last_label
= NULL
;
1619 flag_explicitly_parallel
= 0;
1621 if (etype
== EXEC_UNKNOWN
)
1623 /* Look for the special multiple instruction separators. */
1624 str2
= strstr (str
, "||");
1627 extype
= EXEC_PARALLEL
;
1632 str2
= strstr (str
, "->");
1637 str2
= strstr (str
, "<-");
1639 extype
= EXEC_REVSEQ
;
1643 /* STR2 points to the separator, if one. */
1648 /* If two instructions are present and we already have one saved,
1649 then first write it out. */
1650 d30v_cleanup (FALSE
);
1652 /* Assemble first instruction and save it. */
1653 prev_insn
= do_assemble (str
, &prev_opcode
, 1, 0);
1654 if (prev_insn
== -1)
1655 as_bad (_("Cannot assemble instruction"));
1656 if (prev_opcode
.form
!= NULL
&& prev_opcode
.form
->form
>= LONG
)
1657 as_bad (_("First opcode is long. Unable to mix instructions as specified."));
1658 fixups
= fixups
->next
;
1661 prev_subseg
= now_subseg
;
1665 insn
= do_assemble (str
, &opcode
,
1666 (extype
!= EXEC_UNKNOWN
|| etype
!= EXEC_UNKNOWN
),
1667 extype
== EXEC_PARALLEL
);
1670 if (extype
!= EXEC_UNKNOWN
)
1672 as_bad (_("Cannot assemble instruction"));
1676 if (etype
!= EXEC_UNKNOWN
)
1679 etype
= EXEC_UNKNOWN
;
1682 /* Word multiply instructions must not be followed by either a load or a
1683 16-bit multiply instruction in the next cycle. */
1684 if ( (extype
!= EXEC_REVSEQ
)
1686 && (opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1688 /* However, load and multiply should able to be combined in a parallel
1689 operation, so check for that first. */
1691 && (opcode
.op
->flags_used
& FLAG_MEM
)
1692 && opcode
.form
->form
< LONG
1693 && (extype
== EXEC_PARALLEL
|| (Optimizing
&& extype
== EXEC_UNKNOWN
))
1694 && parallel_ok (&prev_opcode
, (long) prev_insn
,
1695 &opcode
, (long) insn
, extype
)
1696 && write_2_short (&prev_opcode
, (long) prev_insn
,
1697 &opcode
, (long) insn
, extype
, fixups
) == 0)
1699 /* No instructions saved. */
1705 /* Can't parallelize, flush previous instruction and emit a
1706 word of NOPS, unless the previous instruction is a NOP,
1707 in which case just flush it, as this will generate a word
1710 if (prev_insn
!= -1 && (strcmp (prev_opcode
.op
->name
, "nop") == 0))
1711 d30v_cleanup (FALSE
);
1716 if (prev_insn
!= -1)
1717 d30v_cleanup (TRUE
);
1721 d30v_number_to_chars (f
, NOP2
, 8);
1723 if (warn_nops
== NOP_ALL
|| warn_nops
== NOP_MULTIPLY
)
1725 if (opcode
.op
->flags_used
& FLAG_MEM
)
1726 as_warn (_("word of NOPs added between word multiply and load"));
1728 as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1733 extype
= EXEC_UNKNOWN
;
1736 else if ( (extype
== EXEC_REVSEQ
)
1738 && (prev_opcode
.op
->flags_used
& (FLAG_MEM
| FLAG_MUL16
)))
1740 /* Can't parallelize, flush current instruction and add a
1742 write_1_short (&opcode
, (long) insn
, fixups
->next
->next
, TRUE
);
1744 /* Make the previous instruction the current one. */
1745 extype
= EXEC_UNKNOWN
;
1748 now_subseg
= prev_subseg
;
1750 cur_mul32_p
= prev_mul32_p
;
1752 memcpy (&opcode
, &prev_opcode
, sizeof (prev_opcode
));
1755 /* If this is a long instruction, write it and any previous short
1757 if (opcode
.form
->form
>= LONG
)
1759 if (extype
!= EXEC_UNKNOWN
)
1760 as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1761 d30v_cleanup (FALSE
);
1762 write_long (&opcode
, insn
, fixups
);
1765 else if ((prev_insn
!= -1)
1767 (&prev_opcode
, (long) prev_insn
, &opcode
,
1768 (long) insn
, extype
, fixups
) == 0))
1770 /* No instructions saved. */
1775 if (extype
!= EXEC_UNKNOWN
)
1776 as_bad (_("Unable to mix instructions as specified"));
1778 /* Save off last instruction so it may be packed on next pass. */
1779 memcpy (&prev_opcode
, &opcode
, sizeof (prev_opcode
));
1782 prev_subseg
= now_subseg
;
1783 fixups
= fixups
->next
;
1784 prev_mul32_p
= cur_mul32_p
;
1788 /* If while processing a fixup, a reloc really needs to be created,
1789 then it is done here. */
1792 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
1795 reloc
= xmalloc (sizeof (arelent
));
1796 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1797 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1798 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1799 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1800 if (reloc
->howto
== NULL
)
1802 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1803 _("reloc %d not supported by object file format"),
1804 (int) fixp
->fx_r_type
);
1813 md_estimate_size_before_relax (fragS
*fragp ATTRIBUTE_UNUSED
,
1814 asection
*seg ATTRIBUTE_UNUSED
)
1821 md_pcrel_from_section (fixS
*fixp
, segT sec
)
1823 if (fixp
->fx_addsy
!= (symbolS
*) NULL
1824 && (!S_IS_DEFINED (fixp
->fx_addsy
)
1825 || (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1827 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1830 /* Called after the assembler has finished parsing the input file or
1831 after a label is defined. Because the D30V assembler sometimes
1832 saves short instructions to see if it can package them with the
1833 next instruction, there may be a short instruction that still needs
1837 d30v_cleanup (int use_sequential
)
1842 if (prev_insn
!= -1)
1845 subseg
= now_subseg
;
1846 subseg_set (prev_seg
, prev_subseg
);
1847 write_1_short (&prev_opcode
, (long) prev_insn
, fixups
->next
,
1849 subseg_set (seg
, subseg
);
1852 prev_mul32_p
= FALSE
;
1858 /* This function is called at the start of every line. It checks to
1859 see if the first character is a '.', which indicates the start of a
1860 pseudo-op. If it is, then write out any unwritten instructions. */
1863 d30v_start_line (void)
1865 char *c
= input_line_pointer
;
1867 while (ISSPACE (*c
))
1871 d30v_cleanup (FALSE
);
1875 check_size (long value
, int bits
, char *file
, int line
)
1884 max
= (1 << (bits
- 1)) - 1;
1887 as_bad_where (file
, line
, _("value too large to fit in %d bits"), bits
);
1890 /* d30v_frob_label() is called when after a label is recognized. */
1893 d30v_frob_label (symbolS
*lab
)
1895 /* Emit any pending instructions. */
1896 d30v_cleanup (FALSE
);
1898 /* Update the label's address with the current output pointer. */
1899 symbol_set_frag (lab
, frag_now
);
1900 S_SET_VALUE (lab
, (valueT
) frag_now_fix ());
1902 /* Record this label for future adjustment after we find out what
1903 kind of data it references, and the required alignment therewith. */
1904 d30v_last_label
= lab
;
1907 /* Hook into cons for capturing alignment changes. */
1910 d30v_cons_align (int size
)
1915 while ((size
>>= 1) != 0)
1918 if (d30v_current_align
< log_size
)
1919 d30v_align (log_size
, (char *) NULL
, NULL
);
1920 else if (d30v_current_align
> log_size
)
1921 d30v_current_align
= log_size
;
1922 d30v_last_label
= NULL
;
1926 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
1929 unsigned long insn
, insn2
;
1932 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1935 /* We don't support subtracting a symbol. */
1936 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1937 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1939 /* Fetch the instruction, insert the fully resolved operand
1940 value, and stuff the instruction back again. */
1941 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1942 insn
= bfd_getb32 ((unsigned char *) where
);
1944 switch (fixP
->fx_r_type
)
1946 case BFD_RELOC_8
: /* Check for a bad .byte directive. */
1947 if (fixP
->fx_addsy
!= NULL
)
1948 as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1949 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1950 else if (((unsigned)value
) > 0xff)
1951 as_bad (_("line %d: unable to place value %lx into a byte"),
1952 fixP
->fx_line
, value
);
1954 *(unsigned char *) where
= value
;
1957 case BFD_RELOC_16
: /* Check for a bad .short directive. */
1958 if (fixP
->fx_addsy
!= NULL
)
1959 as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1960 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1961 else if (((unsigned)value
) > 0xffff)
1962 as_bad (_("line %d: unable to place value %lx into a short"),
1963 fixP
->fx_line
, value
);
1965 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1968 case BFD_RELOC_64
: /* Check for a bad .quad directive. */
1969 if (fixP
->fx_addsy
!= NULL
)
1970 as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1971 fixP
->fx_line
, S_GET_NAME (fixP
->fx_addsy
));
1974 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1975 bfd_putb32 (0, ((unsigned char *) where
) + 4);
1979 case BFD_RELOC_D30V_6
:
1980 check_size (value
, 6, fixP
->fx_file
, fixP
->fx_line
);
1981 insn
|= value
& 0x3F;
1982 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1985 case BFD_RELOC_D30V_9_PCREL
:
1986 if (fixP
->fx_where
& 0x7)
1991 fixP
->fx_r_type
= BFD_RELOC_D30V_9_PCREL_R
;
1993 check_size (value
, 9, fixP
->fx_file
, fixP
->fx_line
);
1994 insn
|= ((value
>> 3) & 0x3F) << 12;
1995 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1998 case BFD_RELOC_D30V_15
:
1999 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
2000 insn
|= (value
>> 3) & 0xFFF;
2001 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2004 case BFD_RELOC_D30V_15_PCREL
:
2005 if (fixP
->fx_where
& 0x7)
2010 fixP
->fx_r_type
= BFD_RELOC_D30V_15_PCREL_R
;
2012 check_size (value
, 15, fixP
->fx_file
, fixP
->fx_line
);
2013 insn
|= (value
>> 3) & 0xFFF;
2014 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2017 case BFD_RELOC_D30V_21
:
2018 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
2019 insn
|= (value
>> 3) & 0x3FFFF;
2020 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2023 case BFD_RELOC_D30V_21_PCREL
:
2024 if (fixP
->fx_where
& 0x7)
2029 fixP
->fx_r_type
= BFD_RELOC_D30V_21_PCREL_R
;
2031 check_size (value
, 21, fixP
->fx_file
, fixP
->fx_line
);
2032 insn
|= (value
>> 3) & 0x3FFFF;
2033 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2036 case BFD_RELOC_D30V_32
:
2037 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
2038 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
2039 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
2040 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
2041 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2042 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
2045 case BFD_RELOC_D30V_32_PCREL
:
2046 insn2
= bfd_getb32 ((unsigned char *) where
+ 4);
2047 insn
|= (value
>> 26) & 0x3F; /* Top 6 bits. */
2048 insn2
|= ((value
& 0x03FC0000) << 2); /* Next 8 bits. */
2049 insn2
|= value
& 0x0003FFFF; /* Bottom 18 bits. */
2050 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
2051 bfd_putb32 ((bfd_vma
) insn2
, (unsigned char *) where
+ 4);
2055 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
2059 as_bad (_("line %d: unknown relocation type: 0x%x"),
2060 fixP
->fx_line
, fixP
->fx_r_type
);
2064 /* Handle the .align pseudo-op. This aligns to a power of two. We
2065 hook here to latch the current alignment. */
2068 s_d30v_align (int ignore ATTRIBUTE_UNUSED
)
2071 char fill
, *pfill
= NULL
;
2072 long max_alignment
= 15;
2074 align
= get_absolute_expression ();
2075 if (align
> max_alignment
)
2077 align
= max_alignment
;
2078 as_warn (_("Alignment too large: %d assumed"), align
);
2082 as_warn (_("Alignment negative: 0 assumed"));
2086 if (*input_line_pointer
== ',')
2088 input_line_pointer
++;
2089 fill
= get_absolute_expression ();
2093 d30v_last_label
= NULL
;
2094 d30v_align (align
, pfill
, NULL
);
2096 demand_empty_rest_of_line ();
2099 /* Handle the .text pseudo-op. This is like the usual one, but it
2100 clears the saved last label and resets known alignment. */
2107 d30v_last_label
= NULL
;
2108 d30v_current_align
= 0;
2109 d30v_current_align_seg
= now_seg
;
2112 /* Handle the .data pseudo-op. This is like the usual one, but it
2113 clears the saved last label and resets known alignment. */
2119 d30v_last_label
= NULL
;
2120 d30v_current_align
= 0;
2121 d30v_current_align_seg
= now_seg
;
2124 /* Handle the .section pseudo-op. This is like the usual one, but it
2125 clears the saved last label and resets known alignment. */
2128 s_d30v_section (int ignore
)
2130 obj_elf_section (ignore
);
2131 d30v_last_label
= NULL
;
2132 d30v_current_align
= 0;
2133 d30v_current_align_seg
= now_seg
;
2136 /* The target specific pseudo-ops which we support. */
2137 const pseudo_typeS md_pseudo_table
[] =
2139 { "word", cons
, 4 },
2140 { "hword", cons
, 2 },
2141 { "align", s_d30v_align
, 0 },
2142 { "text", s_d30v_text
, 0 },
2143 { "data", s_d30v_data
, 0 },
2144 { "section", s_d30v_section
, 0 },
2145 { "section.s", s_d30v_section
, 0 },
2146 { "sect", s_d30v_section
, 0 },
2147 { "sect.s", s_d30v_section
, 0 },