1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "safe-ctype.h"
26 #include "opcode/d10v.h"
30 const char comment_chars
[] = ";";
31 const char line_comment_chars
[] = "#";
32 const char line_separator_chars
[] = "";
33 const char *md_shortopts
= "O";
34 const char EXP_CHARS
[] = "eE";
35 const char FLT_CHARS
[] = "dD";
39 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \
40 && (X)->X_op_symbol != NULL \
41 && symbol_constant_p ((X)->X_op_symbol) \
42 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
43 #define AT_WORD_RIGHT_SHIFT 2
46 #define MAX_INSN_FIXUPS (5)
53 bfd_reloc_code_real_type reloc
;
56 typedef struct _fixups
59 struct d10v_fixup fix
[MAX_INSN_FIXUPS
];
63 static Fixups FixUps
[2];
64 static Fixups
*fixups
;
66 static int do_not_ignore_hash
= 0;
68 typedef int packing_type
;
69 #define PACK_UNSPEC (0) /* Packing order not specified. */
70 #define PACK_PARALLEL (1) /* "||" */
71 #define PACK_LEFT_RIGHT (2) /* "->" */
72 #define PACK_RIGHT_LEFT (3) /* "<-" */
73 static packing_type etype
= PACK_UNSPEC
; /* Used by d10v_cleanup. */
75 /* True if instruction swapping warnings should be inhibited.
77 static boolean flag_warn_suppress_instructionswap
;
79 /* True if instruction packing should be performed when --gstabs is specified.
80 --gstabs-packing, --no-gstabs-packing. */
81 static boolean flag_allow_gstabs_packing
= 1;
83 /* Local functions. */
84 static int reg_name_search
PARAMS ((char *name
));
85 static int register_name
PARAMS ((expressionS
*expressionP
));
86 static int check_range
PARAMS ((unsigned long num
, int bits
, int flags
));
87 static int postfix
PARAMS ((char *p
));
88 static bfd_reloc_code_real_type get_reloc
PARAMS ((struct d10v_operand
*op
));
89 static int get_operands
PARAMS ((expressionS exp
[]));
90 static struct d10v_opcode
*find_opcode
PARAMS ((struct d10v_opcode
*opcode
, expressionS ops
[]));
91 static unsigned long build_insn
PARAMS ((struct d10v_opcode
*opcode
, expressionS
*opers
, unsigned long insn
));
92 static void write_long
PARAMS ((unsigned long insn
, Fixups
*fx
));
93 static void write_1_short
PARAMS ((struct d10v_opcode
*opcode
, unsigned long insn
, Fixups
*fx
));
94 static int write_2_short
PARAMS ((struct d10v_opcode
*opcode1
, unsigned long insn1
,
95 struct d10v_opcode
*opcode2
, unsigned long insn2
, packing_type exec_type
, Fixups
*fx
));
96 static unsigned long do_assemble
PARAMS ((char *str
, struct d10v_opcode
**opcode
));
97 static unsigned long d10v_insert_operand
PARAMS (( unsigned long insn
, int op_type
,
98 offsetT value
, int left
, fixS
*fix
));
99 static int parallel_ok
PARAMS ((struct d10v_opcode
*opcode1
, unsigned long insn1
,
100 struct d10v_opcode
*opcode2
, unsigned long insn2
,
101 packing_type exec_type
));
102 static symbolS
* find_symbol_matching_register
PARAMS ((expressionS
*));
104 struct option md_longopts
[] =
106 #define OPTION_NOWARNSWAP (OPTION_MD_BASE)
107 {"nowarnswap", no_argument
, NULL
, OPTION_NOWARNSWAP
},
108 #define OPTION_GSTABSPACKING (OPTION_MD_BASE + 1)
109 {"gstabspacking", no_argument
, NULL
, OPTION_GSTABSPACKING
},
110 {"gstabs-packing", no_argument
, NULL
, OPTION_GSTABSPACKING
},
111 #define OPTION_NOGSTABSPACKING (OPTION_MD_BASE + 2)
112 {"nogstabspacking", no_argument
, NULL
, OPTION_NOGSTABSPACKING
},
113 {"no-gstabs-packing", no_argument
, NULL
, OPTION_NOGSTABSPACKING
},
114 {NULL
, no_argument
, NULL
, 0}
117 size_t md_longopts_size
= sizeof (md_longopts
);
119 static void d10v_dot_word
PARAMS ((int));
121 /* The target specific pseudo-ops which we support. */
122 const pseudo_typeS md_pseudo_table
[] =
124 { "word", d10v_dot_word
, 2 },
128 /* Opcode hash table. */
129 static struct hash_control
*d10v_hash
;
131 /* Do a binary search of the d10v_predefined_registers array to see if
132 NAME is a valid regiter name. Return the register number from the
133 array on success, or -1 on failure. */
136 reg_name_search (name
)
139 int middle
, low
, high
;
143 high
= d10v_reg_name_cnt () - 1;
147 middle
= (low
+ high
) / 2;
148 cmp
= strcasecmp (name
, d10v_predefined_registers
[middle
].name
);
154 return d10v_predefined_registers
[middle
].value
;
160 /* Check the string at input_line_pointer
161 to see if it is a valid register name. */
164 register_name (expressionP
)
165 expressionS
*expressionP
;
168 char c
, *p
= input_line_pointer
;
171 && *p
!= '\n' && *p
!= '\r' && *p
!= ',' && *p
!= ' ' && *p
!= ')')
178 /* Look to see if it's in the register table. */
179 reg_number
= reg_name_search (input_line_pointer
);
182 expressionP
->X_op
= O_register
;
183 /* Temporarily store a pointer to the string here. */
184 expressionP
->X_op_symbol
= (symbolS
*) input_line_pointer
;
185 expressionP
->X_add_number
= reg_number
;
186 input_line_pointer
= p
;
195 check_range (num
, bits
, flags
)
203 /* Don't bother checking 16-bit values. */
207 if (flags
& OPERAND_SHIFT
)
209 /* All special shift operands are unsigned and <= 16.
210 We allow 0 for now. */
217 if (flags
& OPERAND_SIGNED
)
219 /* Signed 3-bit integers are restricted to the (-2, 3) range. */
220 if (flags
& RESTRICTED_NUM3
)
222 if ((long) num
< -2 || (long) num
> 3)
227 max
= (1 << (bits
- 1)) - 1;
228 min
= - (1 << (bits
- 1));
229 if (((long) num
> max
) || ((long) num
< min
))
235 max
= (1 << bits
) - 1;
237 if (((long) num
> max
) || ((long) num
< min
))
244 md_show_usage (stream
)
247 fprintf (stream
, _("D10V options:\n\
248 -O Optimize. Will do some operations in parallel.\n\
249 --gstabs-packing Pack adjacent short instructions together even\n\
250 when --gstabs is specified. On by default.\n\
251 --no-gstabs-packing If --gstabs is specified, do not pack adjacent\n\
252 instructions together.\n"));
256 md_parse_option (c
, arg
)
258 char *arg ATTRIBUTE_UNUSED
;
263 /* Optimize. Will attempt to parallelize operations. */
266 case OPTION_NOWARNSWAP
:
267 flag_warn_suppress_instructionswap
= 1;
269 case OPTION_GSTABSPACKING
:
270 flag_allow_gstabs_packing
= 1;
272 case OPTION_NOGSTABSPACKING
:
273 flag_allow_gstabs_packing
= 0;
282 md_undefined_symbol (name
)
283 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 (type
, litP
, sizeP
)
300 LITTLENUM_TYPE words
[4];
314 return _("bad call to md_atof");
317 t
= atof_ieee (input_line_pointer
, type
, words
);
319 input_line_pointer
= t
;
323 for (i
= 0; i
< prec
; i
++)
325 md_number_to_chars (litP
, (valueT
) words
[i
], 2);
332 md_convert_frag (abfd
, sec
, fragP
)
333 bfd
*abfd ATTRIBUTE_UNUSED
;
334 asection
*sec ATTRIBUTE_UNUSED
;
335 fragS
*fragP ATTRIBUTE_UNUSED
;
341 md_section_align (seg
, addr
)
345 int align
= bfd_get_section_alignment (stdoutput
, seg
);
346 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
352 char *prev_name
= "";
353 struct d10v_opcode
*opcode
;
354 d10v_hash
= hash_new ();
356 /* Insert unique names into hash table. The D10v instruction set
357 has many identical opcode names that have different opcodes based
358 on the operands. This hash table then provides a quick index to
359 the first opcode with a particular name in the opcode table. */
361 for (opcode
= (struct d10v_opcode
*) d10v_opcodes
; opcode
->name
; opcode
++)
363 if (strcmp (prev_name
, opcode
->name
))
365 prev_name
= (char *) opcode
->name
;
366 hash_insert (d10v_hash
, opcode
->name
, (char *) opcode
);
371 FixUps
[0].next
= &FixUps
[1];
372 FixUps
[1].next
= &FixUps
[0];
375 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
376 from an expression. */
382 while (*p
!= '-' && *p
!= '+')
384 if (*p
== 0 || *p
== '\n' || *p
== '\r')
403 static bfd_reloc_code_real_type
405 struct d10v_operand
*op
;
412 if (op
->flags
& OPERAND_ADDR
)
415 return (BFD_RELOC_D10V_10_PCREL_R
);
417 return (BFD_RELOC_D10V_18_PCREL
);
420 return (BFD_RELOC_16
);
423 /* Parse a string of operands. Return an array of expressions. */
429 char *p
= input_line_pointer
;
436 while (*p
== ' ' || *p
== '\t' || *p
== ',')
438 if (*p
== 0 || *p
== '\n' || *p
== '\r')
446 exp
[numops
].X_op
= O_absent
;
450 exp
[numops
].X_add_number
= OPERAND_ATPAR
;
455 exp
[numops
].X_add_number
= OPERAND_ATMINUS
;
459 exp
[numops
].X_add_number
= OPERAND_ATSIGN
;
463 exp
[numops
].X_op
= O_absent
;
464 exp
[numops
].X_add_number
= OPERAND_PLUS
;
475 /* Just skip the trailing paren. */
480 input_line_pointer
= p
;
482 /* Check to see if it might be a register name. */
483 if (!register_name (&exp
[numops
]))
485 /* Parse as an expression. */
488 /* Any expression that involves the indirect addressing
489 cannot also involve immediate addressing. Therefore
490 the use of the hash character is illegal. */
491 int save
= do_not_ignore_hash
;
492 do_not_ignore_hash
= 1;
494 expression (&exp
[numops
]);
496 do_not_ignore_hash
= save
;
499 expression (&exp
[numops
]);
502 if (strncasecmp (input_line_pointer
, "@word", 5) == 0)
504 input_line_pointer
+= 5;
505 if (exp
[numops
].X_op
== O_register
)
507 /* If it looked like a register name but was followed by
508 "@word" then it was really a symbol, so change it to
510 exp
[numops
].X_op
= O_symbol
;
511 exp
[numops
].X_add_symbol
=
512 symbol_find_or_make ((char *) exp
[numops
].X_op_symbol
);
515 /* Check for identifier@word+constant. */
516 if (*input_line_pointer
== '-' || *input_line_pointer
== '+')
519 expression (&new_exp
);
520 exp
[numops
].X_add_number
= new_exp
.X_add_number
;
523 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */
526 memset (&new_exp
, 0, sizeof new_exp
);
527 new_exp
.X_add_number
= AT_WORD_RIGHT_SHIFT
;
528 new_exp
.X_op
= O_constant
;
529 new_exp
.X_unsigned
= 1;
530 exp
[numops
].X_op_symbol
= make_expr_symbol (&new_exp
);
531 exp
[numops
].X_op
= O_right_shift
;
534 know (AT_WORD_P (&exp
[numops
]));
537 if (exp
[numops
].X_op
== O_illegal
)
538 as_bad (_("illegal operand"));
539 else if (exp
[numops
].X_op
== O_absent
)
540 as_bad (_("missing operand"));
543 p
= input_line_pointer
;
548 case -1: /* Postdecrement mode. */
549 exp
[numops
].X_op
= O_absent
;
550 exp
[numops
++].X_add_number
= OPERAND_MINUS
;
552 case 1: /* Postincrement mode. */
553 exp
[numops
].X_op
= O_absent
;
554 exp
[numops
++].X_add_number
= OPERAND_PLUS
;
558 exp
[numops
].X_op
= 0;
563 d10v_insert_operand (insn
, op_type
, value
, left
, fix
)
572 shift
= d10v_operands
[op_type
].shift
;
576 bits
= d10v_operands
[op_type
].bits
;
578 /* Truncate to the proper number of bits. */
579 if (check_range (value
, bits
, d10v_operands
[op_type
].flags
))
580 as_bad_where (fix
->fx_file
, fix
->fx_line
,
581 _("operand out of range: %d"), value
);
583 value
&= 0x7FFFFFFF >> (31 - bits
);
584 insn
|= (value
<< shift
);
589 /* Take a pointer to the opcode entry in the opcode table and the
590 array of operand expressions. Return the instruction. */
593 build_insn (opcode
, opers
, insn
)
594 struct d10v_opcode
*opcode
;
598 int i
, bits
, shift
, flags
, format
;
599 unsigned long number
;
601 /* The insn argument is only used for the DIVS kludge. */
606 insn
= opcode
->opcode
;
607 format
= opcode
->format
;
610 for (i
= 0; opcode
->operands
[i
]; i
++)
612 flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
613 bits
= d10v_operands
[opcode
->operands
[i
]].bits
;
614 shift
= d10v_operands
[opcode
->operands
[i
]].shift
;
615 number
= opers
[i
].X_add_number
;
617 if (flags
& OPERAND_REG
)
619 number
&= REGISTER_MASK
;
620 if (format
== LONG_L
)
624 if (opers
[i
].X_op
!= O_register
&& opers
[i
].X_op
!= O_constant
)
626 /* Now create a fixup. */
628 if (fixups
->fc
>= MAX_INSN_FIXUPS
)
629 as_fatal (_("too many fixups"));
631 if (AT_WORD_P (&opers
[i
]))
633 /* Reconize XXX>>1+N aka XXX@word+N as special (AT_WORD). */
634 fixups
->fix
[fixups
->fc
].reloc
= BFD_RELOC_D10V_18
;
635 opers
[i
].X_op
= O_symbol
;
636 opers
[i
].X_op_symbol
= NULL
; /* Should free it. */
637 /* number is left shifted by AT_WORD_RIGHT_SHIFT so
638 that, it is aligned with the symbol's value. Later,
639 BFD_RELOC_D10V_18 will right shift (symbol_value +
641 number
<<= AT_WORD_RIGHT_SHIFT
;
642 opers
[i
].X_add_number
= number
;
645 fixups
->fix
[fixups
->fc
].reloc
=
646 get_reloc ((struct d10v_operand
*) &d10v_operands
[opcode
->operands
[i
]]);
648 if (fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_16
||
649 fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_D10V_18
)
650 fixups
->fix
[fixups
->fc
].size
= 2;
652 fixups
->fix
[fixups
->fc
].size
= 4;
654 fixups
->fix
[fixups
->fc
].exp
= opers
[i
];
655 fixups
->fix
[fixups
->fc
].operand
= opcode
->operands
[i
];
656 fixups
->fix
[fixups
->fc
].pcrel
=
657 (flags
& OPERAND_ADDR
) ? true : false;
661 /* Truncate to the proper number of bits. */
662 if ((opers
[i
].X_op
== O_constant
) && check_range (number
, bits
, flags
))
663 as_bad (_("operand out of range: %d"), number
);
664 number
&= 0x7FFFFFFF >> (31 - bits
);
665 insn
= insn
| (number
<< shift
);
668 /* kludge: for DIVS, we need to put the operands in twice */
669 /* on the second pass, format is changed to LONG_R to force
670 the second set of operands to not be shifted over 15. */
671 if ((opcode
->opcode
== OPCODE_DIVS
) && (format
== LONG_L
))
672 insn
= build_insn (opcode
, opers
, insn
);
677 /* Write out a long form instruction. */
680 write_long (insn
, fx
)
685 char *f
= frag_more (4);
688 number_to_chars_bigendian (f
, insn
, 4);
690 for (i
= 0; i
< fx
->fc
; i
++)
692 if (fx
->fix
[i
].reloc
)
694 where
= f
- frag_now
->fr_literal
;
695 if (fx
->fix
[i
].size
== 2)
698 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
699 fx
->fix
[i
].operand
|= 4096;
701 fix_new_exp (frag_now
,
706 fx
->fix
[i
].operand
|2048);
712 /* Write out a short form instruction by itself. */
715 write_1_short (opcode
, insn
, fx
)
716 struct d10v_opcode
*opcode
;
720 char *f
= frag_more (4);
723 if (opcode
->exec_type
& PARONLY
)
724 as_fatal (_("Instruction must be executed in parallel with another instruction."));
726 /* The other container needs to be NOP. */
727 /* According to 4.3.1: for FM=00, sub-instructions performed only
728 by IU cannot be encoded in L-container. */
729 if (opcode
->unit
== IU
)
730 insn
|= FM00
| (NOP
<< 15); /* Right container. */
732 insn
= FM00
| (insn
<< 15) | NOP
; /* Left container. */
734 number_to_chars_bigendian (f
, insn
, 4);
735 for (i
= 0; i
< fx
->fc
; i
++)
737 if (fx
->fix
[i
].reloc
)
739 where
= f
- frag_now
->fr_literal
;
740 if (fx
->fix
[i
].size
== 2)
743 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
744 fx
->fix
[i
].operand
|= 4096;
746 /* If it's an R reloc, we may have to switch it to L. */
747 if ((fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
)
748 && (opcode
->unit
!= IU
))
749 fx
->fix
[i
].operand
|= 1024;
751 fix_new_exp (frag_now
,
756 fx
->fix
[i
].operand
|2048);
762 /* Expects two short instructions.
763 If possible, writes out both as a single packed instruction.
764 Otherwise, writes out the first one, packed with a NOP.
765 Returns number of instructions not written out. */
768 write_2_short (opcode1
, insn1
, opcode2
, insn2
, exec_type
, fx
)
769 struct d10v_opcode
*opcode1
, *opcode2
;
770 unsigned long insn1
, insn2
;
771 packing_type exec_type
;
778 if ((exec_type
!= PACK_PARALLEL
)
779 && ((opcode1
->exec_type
& PARONLY
) || (opcode2
->exec_type
& PARONLY
)))
780 as_fatal (_("Instruction must be executed in parallel"));
782 if ((opcode1
->format
& LONG_OPCODE
) || (opcode2
->format
& LONG_OPCODE
))
783 as_fatal (_("Long instructions may not be combined."));
787 case PACK_UNSPEC
: /* Order not specified. */
788 if (opcode1
->exec_type
& ALONE
)
790 /* Case of a short branch on a separate GAS line.
792 write_1_short (opcode1
, insn1
, fx
->next
);
796 && parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
))
799 if (opcode1
->unit
== IU
)
800 insn
= FM00
| (insn2
<< 15) | insn1
;
801 else if (opcode2
->unit
== MU
)
802 insn
= FM00
| (insn2
<< 15) | insn1
;
804 insn
= FM00
| (insn1
<< 15) | insn2
;
806 else if (opcode1
->unit
== IU
)
807 /* Reverse sequential with IU opcode1 on right and done first. */
808 insn
= FM10
| (insn2
<< 15) | insn1
;
810 /* Sequential with non-IU opcode1 on left and done first. */
811 insn
= FM01
| (insn1
<< 15) | insn2
;
815 if (opcode1
->exec_type
& SEQ
|| opcode2
->exec_type
& SEQ
)
817 (_("One of these instructions may not be executed in parallel."));
818 if (opcode1
->unit
== IU
)
820 if (opcode2
->unit
== IU
)
821 as_fatal (_("Two IU instructions may not be executed in parallel"));
822 if (!flag_warn_suppress_instructionswap
)
823 as_warn (_("Swapping instruction order"));
824 insn
= FM00
| (insn2
<< 15) | insn1
;
826 else if (opcode2
->unit
== MU
)
828 if (opcode1
->unit
== MU
)
829 as_fatal (_("Two MU instructions may not be executed in parallel"));
830 if (!flag_warn_suppress_instructionswap
)
831 as_warn (_("Swapping instruction order"));
832 insn
= FM00
| (insn2
<< 15) | insn1
;
835 insn
= FM00
| (insn1
<< 15) | insn2
;
838 case PACK_LEFT_RIGHT
:
839 if (opcode1
->unit
!= IU
)
840 insn
= FM01
| (insn1
<< 15) | insn2
;
841 else if (opcode2
->unit
== MU
|| opcode2
->unit
== EITHER
)
843 if (!flag_warn_suppress_instructionswap
)
844 as_warn (_("Swapping instruction order"));
845 insn
= FM10
| (insn2
<< 15) | insn1
;
848 as_fatal (_("IU instruction may not be in the left container"));
849 if (opcode1
->exec_type
& ALONE
)
850 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
853 case PACK_RIGHT_LEFT
:
854 if (opcode2
->unit
!= MU
)
855 insn
= FM10
| (insn1
<< 15) | insn2
;
856 else if (opcode1
->unit
== IU
|| opcode1
->unit
== EITHER
)
858 if (!flag_warn_suppress_instructionswap
)
859 as_warn (_("Swapping instruction order"));
860 insn
= FM01
| (insn2
<< 15) | insn1
;
863 as_fatal (_("MU instruction may not be in the right container"));
864 if (opcode2
->exec_type
& ALONE
)
865 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
869 as_fatal (_("unknown execution type passed to write_2_short()"));
873 number_to_chars_bigendian (f
, insn
, 4);
875 /* Process fixup chains. fx refers to insn2 when j == 0, and to
876 insn1 when j == 1. Yes, it's reversed. */
878 for (j
= 0; j
< 2; j
++)
880 for (i
= 0; i
< fx
->fc
; i
++)
882 if (fx
->fix
[i
].reloc
)
884 where
= f
- frag_now
->fr_literal
;
885 if (fx
->fix
[i
].size
== 2)
888 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
889 /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to
890 the instruction in the L container has to be
891 adjusted to BDF_RELOC_D10V_10_PCREL_L. When
892 j==0, we're processing insn2's operands, so we
893 want to mark the operand if insn2 is *not* in the
894 R container. When j==1, we're processing insn1's
895 operands, so we want to mark the operand if insn2
896 *is* in the R container. Note that, if two
897 instructions are identical, we're never going to
898 swap them, so the test is safe. */
899 && j
== ((insn
& 0x7fff) == insn2
))
900 fx
->fix
[i
].operand
|= 1024;
902 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
903 fx
->fix
[i
].operand
|= 4096;
905 fix_new_exp (frag_now
,
910 fx
->fix
[i
].operand
|2048);
919 /* Check 2 instructions and determine if they can be safely
920 executed in parallel. Return 1 if they can be. */
923 parallel_ok (op1
, insn1
, op2
, insn2
, exec_type
)
924 struct d10v_opcode
*op1
, *op2
;
925 unsigned long insn1
, insn2
;
926 packing_type exec_type
;
928 int i
, j
, flags
, mask
, shift
, regno
;
929 unsigned long ins
, mod
[2], used
[2];
930 struct d10v_opcode
*op
;
932 if ((op1
->exec_type
& SEQ
) != 0 || (op2
->exec_type
& SEQ
) != 0
933 || (op1
->exec_type
& PAR
) == 0 || (op2
->exec_type
& PAR
) == 0
934 || (op1
->unit
== BOTH
) || (op2
->unit
== BOTH
)
935 || (op1
->unit
== IU
&& op2
->unit
== IU
)
936 || (op1
->unit
== MU
&& op2
->unit
== MU
))
939 /* If this is auto parallization, and either instruction is a branch,
941 if (exec_type
== PACK_UNSPEC
942 && (op1
->exec_type
& ALONE
|| op2
->exec_type
& ALONE
))
945 /* The idea here is to create two sets of bitmasks (mod and used)
946 which indicate which registers are modified or used by each
947 instruction. The operation can only be done in parallel if
948 instruction 1 and instruction 2 modify different registers, and
949 the first instruction does not modify registers that the second
950 is using (The second instruction can modify registers that the
951 first is using as they are only written back after the first
952 instruction has completed). Accesses to control registers, PSW,
953 and memory are treated as accesses to a single register. So if
954 both instructions write memory or if the first instruction writes
955 memory and the second reads, then they cannot be done in
956 parallel. Likewise, if the first instruction mucks with the psw
957 and the second reads the PSW (which includes C, F0, and F1), then
958 they cannot operate safely in parallel. */
960 /* The bitmasks (mod and used) look like this (bit 31 = MSB). */
963 /* cr (not psw) 18 */
967 for (j
= 0; j
< 2; j
++)
979 mod
[j
] = used
[j
] = 0;
980 if (op
->exec_type
& BRANCH_LINK
)
983 for (i
= 0; op
->operands
[i
]; i
++)
985 flags
= d10v_operands
[op
->operands
[i
]].flags
;
986 shift
= d10v_operands
[op
->operands
[i
]].shift
;
987 mask
= 0x7FFFFFFF >> (31 - d10v_operands
[op
->operands
[i
]].bits
);
988 if (flags
& OPERAND_REG
)
990 regno
= (ins
>> shift
) & mask
;
991 if (flags
& (OPERAND_ACC0
| OPERAND_ACC1
))
993 else if (flags
& OPERAND_CONTROL
) /* mvtc or mvfc. */
1000 else if (flags
& (OPERAND_FFLAG
| OPERAND_CFLAG
))
1003 if (flags
& OPERAND_DEST
)
1005 mod
[j
] |= 1 << regno
;
1006 if (flags
& OPERAND_EVEN
)
1007 mod
[j
] |= 1 << (regno
+ 1);
1011 used
[j
] |= 1 << regno
;
1012 if (flags
& OPERAND_EVEN
)
1013 used
[j
] |= 1 << (regno
+ 1);
1015 /* Auto inc/dec also modifies the register. */
1016 if (op
->operands
[i
+ 1] != 0
1017 && (d10v_operands
[op
->operands
[i
+ 1]].flags
1018 & (OPERAND_PLUS
| OPERAND_MINUS
)) != 0)
1019 mod
[j
] |= 1 << regno
;
1022 else if (flags
& OPERAND_ATMINUS
)
1024 /* SP implicitly used/modified. */
1029 if (op
->exec_type
& RMEM
)
1031 else if (op
->exec_type
& WMEM
)
1033 else if (op
->exec_type
& RF0
)
1035 else if (op
->exec_type
& WF0
)
1037 else if (op
->exec_type
& WCAR
)
1040 if ((mod
[0] & mod
[1]) == 0 && (mod
[0] & used
[1]) == 0)
1045 /* This is the main entry point for the machine-dependent assembler.
1046 STR points to a machine-dependent instruction. This function is
1047 supposed to emit the frags/bytes it assembles to. For the D10V, it
1048 mostly handles the special VLIW parsing and packing and leaves the
1049 difficult stuff to do_assemble(). */
1051 static unsigned long prev_insn
;
1052 static struct d10v_opcode
*prev_opcode
= 0;
1053 static subsegT prev_subseg
;
1054 static segT prev_seg
= 0;;
1060 /* etype is saved extype. For multi-line instructions. */
1062 packing_type extype
= PACK_UNSPEC
; /* Parallel, etc. */
1064 struct d10v_opcode
*opcode
;
1068 if (etype
== PACK_UNSPEC
)
1070 /* Look for the special multiple instruction separators. */
1071 str2
= strstr (str
, "||");
1073 extype
= PACK_PARALLEL
;
1076 str2
= strstr (str
, "->");
1078 extype
= PACK_LEFT_RIGHT
;
1081 str2
= strstr (str
, "<-");
1083 extype
= PACK_RIGHT_LEFT
;
1086 /* STR2 points to the separator, if there is one. */
1091 /* If two instructions are present and we already have one saved,
1092 then first write out the saved one. */
1095 /* Assemble first instruction and save it. */
1096 prev_insn
= do_assemble (str
, &prev_opcode
);
1098 prev_subseg
= now_subseg
;
1099 if (prev_insn
== (unsigned long) -1)
1100 as_fatal (_("can't find opcode "));
1101 fixups
= fixups
->next
;
1106 insn
= do_assemble (str
, &opcode
);
1107 if (insn
== (unsigned long) -1)
1109 if (extype
!= PACK_UNSPEC
)
1114 as_fatal (_("can't find opcode "));
1117 if (etype
!= PACK_UNSPEC
)
1120 etype
= PACK_UNSPEC
;
1123 /* If this is a long instruction, write it and any previous short
1125 if (opcode
->format
& LONG_OPCODE
)
1127 if (extype
!= PACK_UNSPEC
)
1128 as_fatal (_("Unable to mix instructions as specified"));
1130 write_long (insn
, fixups
);
1137 && ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1141 && (write_2_short (prev_opcode
, prev_insn
, opcode
, insn
, extype
, fixups
) == 0))
1143 /* No instructions saved. */
1148 if (extype
!= PACK_UNSPEC
)
1149 as_fatal (_("Unable to mix instructions as specified"));
1150 /* Save last instruction so it may be packed on next pass. */
1151 prev_opcode
= opcode
;
1154 prev_subseg
= now_subseg
;
1155 fixups
= fixups
->next
;
1159 /* Assemble a single instruction.
1160 Return an opcode, or -1 (an invalid opcode) on error. */
1162 static unsigned long
1163 do_assemble (str
, opcode
)
1165 struct d10v_opcode
**opcode
;
1167 unsigned char *op_start
, *save
;
1168 unsigned char *op_end
;
1171 expressionS myops
[6];
1174 /* Drop leading whitespace. */
1178 /* Find the opcode end. */
1179 for (op_start
= op_end
= (unsigned char *) (str
);
1182 && !is_end_of_line
[*op_end
] && *op_end
!= ' ';
1185 name
[nlen
] = TOLOWER (op_start
[nlen
]);
1193 /* Find the first opcode with the proper name. */
1194 *opcode
= (struct d10v_opcode
*) hash_find (d10v_hash
, name
);
1195 if (*opcode
== NULL
)
1196 as_fatal (_("unknown opcode: %s"), name
);
1198 save
= input_line_pointer
;
1199 input_line_pointer
= op_end
;
1200 *opcode
= find_opcode (*opcode
, myops
);
1203 input_line_pointer
= save
;
1205 insn
= build_insn ((*opcode
), myops
, 0);
1209 /* Find the symbol which has the same name as the register in EXP. */
1212 find_symbol_matching_register (exp
)
1217 if (exp
->X_op
!= O_register
)
1220 /* Find the name of the register. */
1221 for (i
= d10v_reg_name_cnt (); i
--;)
1222 if (d10v_predefined_registers
[i
].value
== exp
->X_add_number
)
1228 /* Now see if a symbol has been defined with the same name. */
1229 return symbol_find (d10v_predefined_registers
[i
].name
);
1232 /* Get a pointer to an entry in the opcode table.
1233 The function must look at all opcodes with the same name and use
1234 the operands to choose the correct opcode. */
1236 static struct d10v_opcode
*
1237 find_opcode (opcode
, myops
)
1238 struct d10v_opcode
*opcode
;
1239 expressionS myops
[];
1242 struct d10v_opcode
*next_opcode
;
1244 /* Get all the operands and save them as expressions. */
1245 get_operands (myops
);
1247 /* Now see if the operand is a fake. If so, find the correct size
1248 instruction, if possible. */
1249 if (opcode
->format
== OPCODE_FAKE
)
1251 int opnum
= opcode
->operands
[0];
1254 if (myops
[opnum
].X_op
== O_register
)
1256 myops
[opnum
].X_op
= O_symbol
;
1257 myops
[opnum
].X_add_symbol
=
1258 symbol_find_or_make ((char *) myops
[opnum
].X_op_symbol
);
1259 myops
[opnum
].X_add_number
= 0;
1260 myops
[opnum
].X_op_symbol
= NULL
;
1263 next_opcode
= opcode
+ 1;
1265 /* If the first operand is supposed to be a register, make sure
1266 we got a valid one. */
1267 flags
= d10v_operands
[next_opcode
->operands
[0]].flags
;
1268 if (flags
& OPERAND_REG
)
1270 int X_op
= myops
[0].X_op
;
1271 int num
= myops
[0].X_add_number
;
1273 if (X_op
!= O_register
1275 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1276 | OPERAND_FFLAG
| OPERAND_CFLAG
| OPERAND_CONTROL
))
1277 || ((flags
& OPERAND_SP
) && ! (num
& OPERAND_SP
)))
1279 as_bad (_("bad opcode or operands"));
1284 if (myops
[opnum
].X_op
== O_constant
1285 || (myops
[opnum
].X_op
== O_symbol
1286 && S_IS_DEFINED (myops
[opnum
].X_add_symbol
)
1287 && (S_GET_SEGMENT (myops
[opnum
].X_add_symbol
) == now_seg
)))
1289 for (i
= 0; opcode
->operands
[i
+ 1]; i
++)
1291 int bits
= d10v_operands
[next_opcode
->operands
[opnum
]].bits
;
1292 int flags
= d10v_operands
[next_opcode
->operands
[opnum
]].flags
;
1293 if (flags
& OPERAND_ADDR
)
1296 if (myops
[opnum
].X_op
== O_constant
)
1298 if (!check_range (myops
[opnum
].X_add_number
, bits
, flags
))
1305 unsigned long current_position
;
1306 unsigned long symbol_position
;
1307 unsigned long value
;
1308 boolean found_symbol
;
1310 /* Calculate the address of the current instruction
1311 and the address of the symbol. Do this by summing
1312 the offsets of previous frags until we reach the
1313 frag containing the symbol, and the current frag. */
1314 sym_frag
= symbol_get_frag (myops
[opnum
].X_add_symbol
);
1315 found_symbol
= false;
1318 obstack_next_free (&frchain_now
->frch_obstack
)
1319 - frag_now
->fr_literal
;
1320 symbol_position
= S_GET_VALUE (myops
[opnum
].X_add_symbol
);
1322 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1324 current_position
+= f
->fr_fix
+ f
->fr_offset
;
1327 found_symbol
= true;
1330 symbol_position
+= f
->fr_fix
+ f
->fr_offset
;
1333 value
= symbol_position
;
1335 if (flags
& OPERAND_ADDR
)
1336 value
-= current_position
;
1338 if (AT_WORD_P (&myops
[opnum
]))
1343 if (!check_range (value
, bits
, flags
))
1347 else if (!check_range (value
, bits
, flags
))
1352 as_fatal (_("value out of range"));
1356 /* Not a constant, so use a long instruction. */
1363 /* Now search the opcode table table for one with operands
1364 that matches what we've got. */
1368 for (i
= 0; opcode
->operands
[i
]; i
++)
1370 int flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
1371 int X_op
= myops
[i
].X_op
;
1372 int num
= myops
[i
].X_add_number
;
1380 if (flags
& OPERAND_REG
)
1382 if ((X_op
!= O_register
)
1384 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1385 | OPERAND_FFLAG
| OPERAND_CFLAG
1387 || ((flags
& OPERAND_SP
) && ! (num
& OPERAND_SP
)))
1394 if (((flags
& OPERAND_MINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_MINUS
))) ||
1395 ((flags
& OPERAND_PLUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_PLUS
))) ||
1396 ((flags
& OPERAND_ATMINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATMINUS
))) ||
1397 ((flags
& OPERAND_ATPAR
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATPAR
))) ||
1398 ((flags
& OPERAND_ATSIGN
) && ((X_op
!= O_absent
) || ((num
!= OPERAND_ATSIGN
) && (num
!= OPERAND_ATPAR
)))))
1404 /* Unfortunatly, for the indirect operand in
1405 instructions such as ``ldb r1, @(c,r14)'' this
1406 function can be passed X_op == O_register (because
1407 'c' is a valid register name). However we cannot
1408 just ignore the case when X_op == O_register but
1409 flags & OPERAND_REG is null, so we check to see if a
1410 symbol of the same name as the register exists. If
1411 the symbol does exist, then the parser was unable to
1412 distinguish the two cases and we fix things here.
1415 if (!(flags
& OPERAND_REG
) && (X_op
== O_register
))
1417 symbolS
*sym
= find_symbol_matching_register (&myops
[i
]);
1421 myops
[i
].X_op
= X_op
= O_symbol
;
1422 myops
[i
].X_add_symbol
= sym
;
1426 (_("illegal operand - register name found where none expected"));
1430 /* We're only done if the operands matched so far AND there
1431 are no more to check. */
1432 if (match
&& myops
[i
].X_op
== 0)
1437 next_opcode
= opcode
+ 1;
1439 if (next_opcode
->opcode
== 0)
1442 if (strcmp (next_opcode
->name
, opcode
->name
))
1445 opcode
= next_opcode
;
1451 as_bad (_("bad opcode or operands"));
1455 /* Check that all registers that are required to be even are.
1456 Also, if any operands were marked as registers, but were really symbols,
1458 for (i
= 0; opcode
->operands
[i
]; i
++)
1460 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_EVEN
) &&
1461 (myops
[i
].X_add_number
& 1))
1462 as_fatal (_("Register number must be EVEN"));
1463 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_NOSP
)
1464 && (myops
[i
].X_add_number
& OPERAND_SP
))
1465 as_bad (_("Unsupported use of sp"));
1466 if (myops
[i
].X_op
== O_register
)
1468 if (!(d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_REG
))
1470 myops
[i
].X_op
= O_symbol
;
1471 myops
[i
].X_add_symbol
=
1472 symbol_find_or_make ((char *) myops
[i
].X_op_symbol
);
1473 myops
[i
].X_add_number
= 0;
1474 myops
[i
].X_op_symbol
= NULL
;
1481 /* If while processing a fixup, a reloc really needs to be created.
1482 Then it is done here. */
1485 tc_gen_reloc (seg
, fixp
)
1486 asection
*seg ATTRIBUTE_UNUSED
;
1490 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1491 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1492 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1493 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1494 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1495 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1497 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1498 _("reloc %d not supported by object file format"),
1499 (int) fixp
->fx_r_type
);
1503 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1504 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1505 reloc
->address
= fixp
->fx_offset
;
1507 reloc
->addend
= fixp
->fx_addnumber
;
1513 md_estimate_size_before_relax (fragp
, seg
)
1514 fragS
*fragp ATTRIBUTE_UNUSED
;
1515 asection
*seg ATTRIBUTE_UNUSED
;
1522 md_pcrel_from_section (fixp
, sec
)
1526 if (fixp
->fx_addsy
!= (symbolS
*) NULL
1527 && (!S_IS_DEFINED (fixp
->fx_addsy
)
1528 || (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1530 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1534 md_apply_fix3 (fixP
, valP
, seg
)
1537 segT seg ATTRIBUTE_UNUSED
;
1541 long value
= * (long *) valP
;
1545 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
1548 else if (fixP
->fx_pcrel
)
1553 value
= fixP
->fx_offset
;
1555 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1557 if (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)
1558 value
-= S_GET_VALUE (fixP
->fx_subsy
);
1561 /* We don't actually support subtracting a symbol. */
1562 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1563 _("expression too complex"));
1568 op_type
= fixP
->fx_r_type
;
1575 fixP
->fx_r_type
= BFD_RELOC_D10V_10_PCREL_L
;
1578 else if (op_type
& 4096)
1581 fixP
->fx_r_type
= BFD_RELOC_D10V_18
;
1585 get_reloc ((struct d10v_operand
*) &d10v_operands
[op_type
]);
1588 /* Fetch the instruction, insert the fully resolved operand
1589 value, and stuff the instruction back again. */
1590 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1591 insn
= bfd_getb32 ((unsigned char *) where
);
1593 switch (fixP
->fx_r_type
)
1595 case BFD_RELOC_D10V_10_PCREL_L
:
1596 case BFD_RELOC_D10V_10_PCREL_R
:
1597 case BFD_RELOC_D10V_18_PCREL
:
1598 case BFD_RELOC_D10V_18
:
1599 /* Instruction addresses are always right-shifted by 2. */
1600 value
>>= AT_WORD_RIGHT_SHIFT
;
1601 if (fixP
->fx_size
== 2)
1602 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1605 struct d10v_opcode
*rep
, *repi
;
1607 rep
= (struct d10v_opcode
*) hash_find (d10v_hash
, "rep");
1608 repi
= (struct d10v_opcode
*) hash_find (d10v_hash
, "repi");
1609 if ((insn
& FM11
) == FM11
1610 && ( (repi
!= NULL
&& (insn
& repi
->mask
) == (unsigned) repi
->opcode
)
1611 || (rep
!= NULL
&& (insn
& rep
->mask
) == (unsigned) rep
->opcode
))
1614 (_("line %d: rep or repi must include at least 4 instructions"),
1617 d10v_insert_operand (insn
, op_type
, (offsetT
) value
, left
, fixP
);
1618 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1622 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1625 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1628 case BFD_RELOC_VTABLE_INHERIT
:
1629 case BFD_RELOC_VTABLE_ENTRY
:
1634 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1635 fixP
->fx_line
, fixP
->fx_r_type
);
1639 /* d10v_cleanup() is called after the assembler has finished parsing
1640 the input file, when a label is read from the input file, or when a
1641 stab directive is output. Because the D10V assembler sometimes
1642 saves short instructions to see if it can package them with the
1643 next instruction, there may be a short instruction that still needs
1646 NOTE: accesses a global, etype.
1647 NOTE: invoked by various macros such as md_cleanup: see. */
1655 /* If cleanup was invoked because the assembler encountered, e.g., a
1656 user label, we write out the pending instruction, if any. If it
1657 was invoked because the assembler is outputting a piece of line
1658 debugging information, though, we write out the pending
1659 instruction only if the --no-gstabs-packing command line switch
1660 has been specified. */
1662 && etype
== PACK_UNSPEC
1663 && (! outputting_stabs_line_debug
|| ! flag_allow_gstabs_packing
))
1666 subseg
= now_subseg
;
1669 subseg_set (prev_seg
, prev_subseg
);
1671 write_1_short (prev_opcode
, prev_insn
, fixups
->next
);
1673 subseg_set (seg
, subseg
);
1679 /* Like normal .word, except support @word. */
1680 /* Clobbers input_line_pointer, checks end-of-line. */
1683 d10v_dot_word (dummy
)
1684 int dummy ATTRIBUTE_UNUSED
;
1689 if (is_it_end_of_statement ())
1691 demand_empty_rest_of_line ();
1698 if (!strncasecmp (input_line_pointer
, "@word", 5))
1700 exp
.X_add_number
= 0;
1701 input_line_pointer
+= 5;
1704 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 2,
1705 &exp
, 0, BFD_RELOC_D10V_18
);
1708 emit_expr (&exp
, 2);
1710 while (*input_line_pointer
++ == ',');
1712 input_line_pointer
--; /* Put terminator back into stream. */
1713 demand_empty_rest_of_line ();
1716 /* Mitsubishi asked that we support some old syntax that apparently
1717 had immediate operands starting with '#'. This is in some of their
1718 sample code but is not documented (although it appears in some
1719 examples in their assembler manual). For now, we'll solve this
1720 compatibility problem by simply ignoring any '#' at the beginning
1723 /* Operands that begin with '#' should fall through to here. */
1727 md_operand (expressionP
)
1728 expressionS
*expressionP
;
1730 if (*input_line_pointer
== '#' && ! do_not_ignore_hash
)
1732 input_line_pointer
++;
1733 expression (expressionP
);
1738 d10v_fix_adjustable (fixP
)
1741 if (fixP
->fx_addsy
== NULL
)
1744 /* Prevent all adjustments to global symbols. */
1745 if (S_IS_EXTERN (fixP
->fx_addsy
))
1747 if (S_IS_WEAK (fixP
->fx_addsy
))
1750 /* We need the symbol name for the VTABLE entries. */
1751 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1752 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1759 d10v_force_relocation (fixp
)
1762 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1763 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)