1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation.
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. */
25 #include "opcode/d10v.h"
28 const char comment_chars
[] = ";";
29 const char line_comment_chars
[] = "#";
30 const char line_separator_chars
[] = "";
31 const char *md_shortopts
= "O";
32 const char EXP_CHARS
[] = "eE";
33 const char FLT_CHARS
[] = "dD";
37 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \
38 && (X)->X_op_symbol != NULL \
39 && symbol_constant_p ((X)->X_op_symbol) \
40 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
41 #define AT_WORD_RIGHT_SHIFT 2
45 #define MAX_INSN_FIXUPS (5)
52 bfd_reloc_code_real_type reloc
;
55 typedef struct _fixups
58 struct d10v_fixup fix
[MAX_INSN_FIXUPS
];
62 static Fixups FixUps
[2];
63 static Fixups
*fixups
;
65 static int do_not_ignore_hash
= 0;
67 typedef int packing_type
;
68 #define PACK_UNSPEC (0) /* packing order not specified */
69 #define PACK_PARALLEL (1) /* "||" */
70 #define PACK_LEFT_RIGHT (2) /* "->" */
71 #define PACK_RIGHT_LEFT (3) /* "<-" */
72 static packing_type etype
= PACK_UNSPEC
; /* used by d10v_cleanup */
74 /* True if instruction swapping warnings should be inhibited. */
75 static unsigned char flag_warn_suppress_instructionswap
; /* --nowarnswap */
78 static int reg_name_search
PARAMS ((char *name
));
79 static int register_name
PARAMS ((expressionS
*expressionP
));
80 static int check_range
PARAMS ((unsigned long num
, int bits
, int flags
));
81 static int postfix
PARAMS ((char *p
));
82 static bfd_reloc_code_real_type get_reloc
PARAMS ((struct d10v_operand
*op
));
83 static int get_operands
PARAMS ((expressionS exp
[]));
84 static struct d10v_opcode
*find_opcode
PARAMS ((struct d10v_opcode
*opcode
, expressionS ops
[]));
85 static unsigned long build_insn
PARAMS ((struct d10v_opcode
*opcode
, expressionS
*opers
, unsigned long insn
));
86 static void write_long
PARAMS ((struct d10v_opcode
*opcode
, unsigned long insn
, Fixups
*fx
));
87 static void write_1_short
PARAMS ((struct d10v_opcode
*opcode
, unsigned long insn
, Fixups
*fx
));
88 static int write_2_short
PARAMS ((struct d10v_opcode
*opcode1
, unsigned long insn1
,
89 struct d10v_opcode
*opcode2
, unsigned long insn2
, packing_type exec_type
, Fixups
*fx
));
90 static unsigned long do_assemble
PARAMS ((char *str
, struct d10v_opcode
**opcode
));
91 static unsigned long d10v_insert_operand
PARAMS (( unsigned long insn
, int op_type
,
92 offsetT value
, int left
, fixS
*fix
));
93 static int parallel_ok
PARAMS ((struct d10v_opcode
*opcode1
, unsigned long insn1
,
94 struct d10v_opcode
*opcode2
, unsigned long insn2
,
95 packing_type exec_type
));
96 static symbolS
* find_symbol_matching_register
PARAMS ((expressionS
*));
98 struct option md_longopts
[] =
100 #define OPTION_NOWARNSWAP (OPTION_MD_BASE)
101 {"nowarnswap", no_argument
, NULL
, OPTION_NOWARNSWAP
},
102 {NULL
, no_argument
, NULL
, 0}
104 size_t md_longopts_size
= sizeof(md_longopts
);
106 static void d10v_dot_word
PARAMS ((int));
108 /* The target specific pseudo-ops which we support. */
109 const pseudo_typeS md_pseudo_table
[] =
111 { "word", d10v_dot_word
, 2 },
115 /* Opcode hash table. */
116 static struct hash_control
*d10v_hash
;
118 /* reg_name_search does a binary search of the d10v_predefined_registers
119 array to see if "name" is a valid regiter name. Returns the register
120 number from the array on success, or -1 on failure. */
123 reg_name_search (name
)
126 int middle
, low
, high
;
130 high
= d10v_reg_name_cnt() - 1;
134 middle
= (low
+ high
) / 2;
135 cmp
= strcasecmp (name
, d10v_predefined_registers
[middle
].name
);
141 return d10v_predefined_registers
[middle
].value
;
147 /* register_name() checks the string at input_line_pointer
148 to see if it is a valid register name */
151 register_name (expressionP
)
152 expressionS
*expressionP
;
155 char c
, *p
= input_line_pointer
;
157 while (*p
&& *p
!='\n' && *p
!='\r' && *p
!=',' && *p
!=' ' && *p
!=')')
164 /* look to see if it's in the register table */
165 reg_number
= reg_name_search (input_line_pointer
);
168 expressionP
->X_op
= O_register
;
169 /* temporarily store a pointer to the string here */
170 expressionP
->X_op_symbol
= (symbolS
*)input_line_pointer
;
171 expressionP
->X_add_number
= reg_number
;
172 input_line_pointer
= p
;
182 check_range (num
, bits
, flags
)
190 /* don't bother checking 16-bit values */
194 if (flags
& OPERAND_SHIFT
)
196 /* all special shift operands are unsigned */
197 /* and <= 16. We allow 0 for now. */
204 if (flags
& OPERAND_SIGNED
)
206 /* Signed 3-bit integers are restricted to the (-2, 3) range */
207 if (flags
& RESTRICTED_NUM3
)
209 if ((long) num
< -2 || (long) num
> 3)
214 max
= (1 << (bits
- 1)) - 1;
215 min
= - (1 << (bits
- 1));
216 if (((long) num
> max
) || ((long) num
< min
))
222 max
= (1 << bits
) - 1;
224 if ((num
> max
) || (num
< min
))
232 md_show_usage (stream
)
235 fprintf(stream
, _("D10V options:\n\
236 -O optimize. Will do some operations in parallel.\n"));
240 md_parse_option (c
, arg
)
247 /* Optimize. Will attempt to parallelize operations */
250 case OPTION_NOWARNSWAP
:
251 flag_warn_suppress_instructionswap
= 1;
260 md_undefined_symbol (name
)
266 /* Turn a string in input_line_pointer into a floating point constant of type
267 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
268 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
271 md_atof (type
, litP
, sizeP
)
277 LITTLENUM_TYPE words
[4];
291 return _("bad call to md_atof");
294 t
= atof_ieee (input_line_pointer
, type
, words
);
296 input_line_pointer
= t
;
300 for (i
= 0; i
< prec
; i
++)
302 md_number_to_chars (litP
, (valueT
) words
[i
], 2);
309 md_convert_frag (abfd
, sec
, fragP
)
318 md_section_align (seg
, addr
)
322 int align
= bfd_get_section_alignment (stdoutput
, seg
);
323 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
330 char *prev_name
= "";
331 struct d10v_opcode
*opcode
;
332 d10v_hash
= hash_new();
334 /* Insert unique names into hash table. The D10v instruction set
335 has many identical opcode names that have different opcodes based
336 on the operands. This hash table then provides a quick index to
337 the first opcode with a particular name in the opcode table. */
339 for (opcode
= (struct d10v_opcode
*)d10v_opcodes
; opcode
->name
; opcode
++)
341 if (strcmp (prev_name
, opcode
->name
))
343 prev_name
= (char *)opcode
->name
;
344 hash_insert (d10v_hash
, opcode
->name
, (char *) opcode
);
349 FixUps
[0].next
= &FixUps
[1];
350 FixUps
[1].next
= &FixUps
[0];
354 /* this function removes the postincrement or postdecrement
355 operator ( '+' or '-' ) from an expression */
357 static int postfix (p
)
360 while (*p
!= '-' && *p
!= '+')
362 if (*p
==0 || *p
=='\n' || *p
=='\r')
382 static bfd_reloc_code_real_type
384 struct d10v_operand
*op
;
391 if (op
->flags
& OPERAND_ADDR
)
394 return (BFD_RELOC_D10V_10_PCREL_R
);
396 return (BFD_RELOC_D10V_18_PCREL
);
399 return (BFD_RELOC_16
);
403 /* get_operands parses a string of operands and returns
404 an array of expressions */
410 char *p
= input_line_pointer
;
417 while (*p
== ' ' || *p
== '\t' || *p
== ',')
419 if (*p
==0 || *p
=='\n' || *p
=='\r')
427 exp
[numops
].X_op
= O_absent
;
431 exp
[numops
].X_add_number
= OPERAND_ATPAR
;
436 exp
[numops
].X_add_number
= OPERAND_ATMINUS
;
440 exp
[numops
].X_add_number
= OPERAND_ATSIGN
;
449 /* just skip the trailing paren */
454 input_line_pointer
= p
;
456 /* check to see if it might be a register name */
457 if (!register_name (&exp
[numops
]))
459 /* parse as an expression */
462 /* Any expression that involves the indirect addressing
463 cannot also involve immediate addressing. Therefore
464 the use of the hash character is illegal. */
465 int save
= do_not_ignore_hash
;
466 do_not_ignore_hash
= 1;
468 expression (&exp
[numops
]);
470 do_not_ignore_hash
= save
;
473 expression (&exp
[numops
]);
476 if (strncasecmp (input_line_pointer
, "@word", 5) == 0)
478 input_line_pointer
+= 5;
479 if (exp
[numops
].X_op
== O_register
)
481 /* if it looked like a register name but was followed by
482 "@word" then it was really a symbol, so change it to
484 exp
[numops
].X_op
= O_symbol
;
485 exp
[numops
].X_add_symbol
= symbol_find_or_make ((char *)exp
[numops
].X_op_symbol
);
488 /* check for identifier@word+constant */
489 if (*input_line_pointer
== '-' || *input_line_pointer
== '+')
491 char *orig_line
= input_line_pointer
;
493 expression (&new_exp
);
494 exp
[numops
].X_add_number
= new_exp
.X_add_number
;
497 /* convert expr into a right shift by AT_WORD_RIGHT_SHIFT */
500 memset (&new_exp
, 0, sizeof new_exp
);
501 new_exp
.X_add_number
= AT_WORD_RIGHT_SHIFT
;
502 new_exp
.X_op
= O_constant
;
503 new_exp
.X_unsigned
= 1;
504 exp
[numops
].X_op_symbol
= make_expr_symbol (&new_exp
);
505 exp
[numops
].X_op
= O_right_shift
;
508 know (AT_WORD_P (&exp
[numops
]));
511 if (exp
[numops
].X_op
== O_illegal
)
512 as_bad (_("illegal operand"));
513 else if (exp
[numops
].X_op
== O_absent
)
514 as_bad (_("missing operand"));
517 p
= input_line_pointer
;
522 case -1: /* postdecrement mode */
523 exp
[numops
].X_op
= O_absent
;
524 exp
[numops
++].X_add_number
= OPERAND_MINUS
;
526 case 1: /* postincrement mode */
527 exp
[numops
].X_op
= O_absent
;
528 exp
[numops
++].X_add_number
= OPERAND_PLUS
;
532 exp
[numops
].X_op
= 0;
537 d10v_insert_operand (insn
, op_type
, value
, left
, fix
)
546 shift
= d10v_operands
[op_type
].shift
;
550 bits
= d10v_operands
[op_type
].bits
;
552 /* truncate to the proper number of bits */
553 if (check_range (value
, bits
, d10v_operands
[op_type
].flags
))
554 as_bad_where (fix
->fx_file
, fix
->fx_line
, _("operand out of range: %d"), value
);
556 value
&= 0x7FFFFFFF >> (31 - bits
);
557 insn
|= (value
<< shift
);
563 /* build_insn takes a pointer to the opcode entry in the opcode table
564 and the array of operand expressions and returns the instruction */
567 build_insn (opcode
, opers
, insn
)
568 struct d10v_opcode
*opcode
;
572 int i
, bits
, shift
, flags
, format
;
573 unsigned long number
;
575 /* the insn argument is only used for the DIVS kludge */
580 insn
= opcode
->opcode
;
581 format
= opcode
->format
;
584 for (i
=0;opcode
->operands
[i
];i
++)
586 flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
587 bits
= d10v_operands
[opcode
->operands
[i
]].bits
;
588 shift
= d10v_operands
[opcode
->operands
[i
]].shift
;
589 number
= opers
[i
].X_add_number
;
591 if (flags
& OPERAND_REG
)
593 number
&= REGISTER_MASK
;
594 if (format
== LONG_L
)
598 if (opers
[i
].X_op
!= O_register
&& opers
[i
].X_op
!= O_constant
)
600 /* now create a fixup */
602 if (fixups
->fc
>= MAX_INSN_FIXUPS
)
603 as_fatal (_("too many fixups"));
605 if (AT_WORD_P (&opers
[i
]))
607 /* Reconize XXX>>1+N aka XXX@word+N as special (AT_WORD) */
608 fixups
->fix
[fixups
->fc
].reloc
= BFD_RELOC_D10V_18
;
609 opers
[i
].X_op
= O_symbol
;
610 opers
[i
].X_op_symbol
= NULL
; /* Should free it */
611 /* number is left shifted by AT_WORD_RIGHT_SHIFT so
612 that, it is aligned with the symbol's value. Later,
613 BFD_RELOC_D10V_18 will right shift (symbol_value +
615 number
<<= AT_WORD_RIGHT_SHIFT
;
616 opers
[i
].X_add_number
= number
;
619 fixups
->fix
[fixups
->fc
].reloc
=
620 get_reloc((struct d10v_operand
*)&d10v_operands
[opcode
->operands
[i
]]);
622 if (fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_16
||
623 fixups
->fix
[fixups
->fc
].reloc
== BFD_RELOC_D10V_18
)
624 fixups
->fix
[fixups
->fc
].size
= 2;
626 fixups
->fix
[fixups
->fc
].size
= 4;
628 fixups
->fix
[fixups
->fc
].exp
= opers
[i
];
629 fixups
->fix
[fixups
->fc
].operand
= opcode
->operands
[i
];
630 fixups
->fix
[fixups
->fc
].pcrel
= (flags
& OPERAND_ADDR
) ? true : false;
634 /* truncate to the proper number of bits */
635 if ((opers
[i
].X_op
== O_constant
) && check_range (number
, bits
, flags
))
636 as_bad (_("operand out of range: %d"),number
);
637 number
&= 0x7FFFFFFF >> (31 - bits
);
638 insn
= insn
| (number
<< shift
);
641 /* kludge: for DIVS, we need to put the operands in twice */
642 /* on the second pass, format is changed to LONG_R to force */
643 /* the second set of operands to not be shifted over 15 */
644 if ((opcode
->opcode
== OPCODE_DIVS
) && (format
==LONG_L
))
645 insn
= build_insn (opcode
, opers
, insn
);
650 /* write out a long form instruction */
652 write_long (opcode
, insn
, fx
)
653 struct d10v_opcode
*opcode
;
658 char *f
= frag_more(4);
661 number_to_chars_bigendian (f
, insn
, 4);
663 for (i
=0; i
< fx
->fc
; i
++)
665 if (fx
->fix
[i
].reloc
)
667 where
= f
- frag_now
->fr_literal
;
668 if (fx
->fix
[i
].size
== 2)
671 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
672 fx
->fix
[i
].operand
|= 4096;
674 fix_new_exp (frag_now
,
679 fx
->fix
[i
].operand
|2048);
686 /* write out a short form instruction by itself */
688 write_1_short (opcode
, insn
, fx
)
689 struct d10v_opcode
*opcode
;
693 char *f
= frag_more(4);
696 if (opcode
->exec_type
& PARONLY
)
697 as_fatal (_("Instruction must be executed in parallel with another instruction."));
699 /* the other container needs to be NOP */
700 /* according to 4.3.1: for FM=00, sub-instructions performed only
701 by IU cannot be encoded in L-container. */
702 if (opcode
->unit
== IU
)
703 insn
|= FM00
| (NOP
<< 15); /* right container */
705 insn
= FM00
| (insn
<< 15) | NOP
; /* left container */
707 number_to_chars_bigendian (f
, insn
, 4);
708 for (i
=0; i
< fx
->fc
; i
++)
710 if (fx
->fix
[i
].reloc
)
712 where
= f
- frag_now
->fr_literal
;
713 if (fx
->fix
[i
].size
== 2)
716 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
717 fx
->fix
[i
].operand
|= 4096;
719 /* if it's an R reloc, we may have to switch it to L */
720 if ( (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
) && (opcode
->unit
!= IU
) )
721 fx
->fix
[i
].operand
|= 1024;
723 fix_new_exp (frag_now
,
728 fx
->fix
[i
].operand
|2048);
734 /* Expects two short instructions.
735 If possible, writes out both as a single packed instruction.
736 Otherwise, writes out the first one, packed with a NOP.
737 Returns number of instructions not written out. */
740 write_2_short (opcode1
, insn1
, opcode2
, insn2
, exec_type
, fx
)
741 struct d10v_opcode
*opcode1
, *opcode2
;
742 unsigned long insn1
, insn2
;
743 packing_type exec_type
;
750 if ( (exec_type
!= PACK_PARALLEL
) && ((opcode1
->exec_type
& PARONLY
)
751 || (opcode2
->exec_type
& PARONLY
)))
752 as_fatal (_("Instruction must be executed in parallel"));
754 if ( (opcode1
->format
& LONG_OPCODE
) || (opcode2
->format
& LONG_OPCODE
))
755 as_fatal (_("Long instructions may not be combined."));
760 case PACK_UNSPEC
: /* order not specified */
761 if (opcode1
->exec_type
& ALONE
)
763 /* Case of a short branch on a separate GAS line. Pack with NOP. */
764 write_1_short (opcode1
, insn1
, fx
->next
);
767 if (Optimizing
&& parallel_ok (opcode1
, insn1
, opcode2
, insn2
, exec_type
))
770 if (opcode1
->unit
== IU
)
771 insn
= FM00
| (insn2
<< 15) | insn1
;
772 else if (opcode2
->unit
== MU
)
773 insn
= FM00
| (insn2
<< 15) | insn1
;
776 insn
= FM00
| (insn1
<< 15) | insn2
;
777 /* Advance over dummy fixup since packed insn1 in L */
781 else if (opcode1
->unit
== IU
)
782 /* reverse sequential with IU opcode1 on right and done first */
783 insn
= FM10
| (insn2
<< 15) | insn1
;
786 /* sequential with non-IU opcode1 on left and done first */
787 insn
= FM01
| (insn1
<< 15) | insn2
;
788 /* Advance over dummy fixup since packed insn1 in L */
795 if (opcode1
->exec_type
& SEQ
|| opcode2
->exec_type
& SEQ
)
797 (_("One of these instructions may not be executed in parallel."));
798 if (opcode1
->unit
== IU
)
800 if (opcode2
->unit
== IU
)
801 as_fatal (_("Two IU instructions may not be executed in parallel"));
802 if (!flag_warn_suppress_instructionswap
)
803 as_warn (_("Swapping instruction order"));
804 insn
= FM00
| (insn2
<< 15) | insn1
;
806 else if (opcode2
->unit
== MU
)
808 if (opcode1
->unit
== MU
)
809 as_fatal (_("Two MU instructions may not be executed in parallel"));
810 if (!flag_warn_suppress_instructionswap
)
811 as_warn (_("Swapping instruction order"));
812 insn
= FM00
| (insn2
<< 15) | insn1
;
816 insn
= FM00
| (insn1
<< 15) | insn2
;
817 /* Advance over dummy fixup since packed insn1 in L */
823 case PACK_LEFT_RIGHT
:
824 if (opcode1
->unit
!= IU
)
825 insn
= FM01
| (insn1
<< 15) | insn2
;
826 else if (opcode2
->unit
== MU
|| opcode2
->unit
== EITHER
)
828 if (!flag_warn_suppress_instructionswap
)
829 as_warn (_("Swapping instruction order"));
830 insn
= FM10
| (insn2
<< 15) | insn1
;
833 as_fatal (_("IU instruction may not be in the left container"));
834 if (opcode1
->exec_type
& ALONE
)
835 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
836 /* Advance over dummy fixup */
841 case PACK_RIGHT_LEFT
:
842 if (opcode2
->unit
!= MU
)
843 insn
= FM10
| (insn1
<< 15) | insn2
;
844 else if (opcode1
->unit
== IU
|| opcode1
->unit
== EITHER
)
846 if (!flag_warn_suppress_instructionswap
)
847 as_warn (_("Swapping instruction order"));
848 insn
= FM01
| (insn2
<< 15) | insn1
;
851 as_fatal (_("MU instruction may not be in the right container"));
852 if (opcode2
->exec_type
& ALONE
)
853 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
854 /* Advance over dummy fixup */
860 as_fatal (_("unknown execution type passed to write_2_short()"));
865 number_to_chars_bigendian (f
, insn
, 4);
867 /* Process fixup chains.
868 Note that the packing code above advanced fx conditionally.
869 dlindsay@cygnus.com: There's something subtle going on here involving
870 _dummy_first_bfd_reloc_code_real. This is related to the
871 difference between BFD_RELOC_D10V_10_PCREL_R and _L, ie whether
872 a fixup is done in the L or R container. A bug in this code
873 can pass Plum Hall fine, yet still affect hand-written assembler. */
877 for (i
=0; i
< fx
->fc
; i
++)
879 if (fx
->fix
[i
].reloc
)
881 where
= f
- frag_now
->fr_literal
;
882 if (fx
->fix
[i
].size
== 2)
885 if ( (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_10_PCREL_R
) && (j
== 0) )
886 fx
->fix
[i
].operand
|= 1024;
888 if (fx
->fix
[i
].reloc
== BFD_RELOC_D10V_18
)
889 fx
->fix
[i
].operand
|= 4096;
891 fix_new_exp (frag_now
,
896 fx
->fix
[i
].operand
|2048);
906 /* Check 2 instructions and determine if they can be safely */
907 /* executed in parallel. Returns 1 if they can be. */
909 parallel_ok (op1
, insn1
, op2
, insn2
, exec_type
)
910 struct d10v_opcode
*op1
, *op2
;
911 unsigned long insn1
, insn2
;
912 packing_type exec_type
;
914 int i
, j
, flags
, mask
, shift
, regno
;
915 unsigned long ins
, mod
[2], used
[2];
916 struct d10v_opcode
*op
;
918 if ((op1
->exec_type
& SEQ
) != 0 || (op2
->exec_type
& SEQ
) != 0
919 || (op1
->exec_type
& PAR
) == 0 || (op2
->exec_type
& PAR
) == 0
920 || (op1
->unit
== BOTH
) || (op2
->unit
== BOTH
)
921 || (op1
->unit
== IU
&& op2
->unit
== IU
)
922 || (op1
->unit
== MU
&& op2
->unit
== MU
))
925 /* If this is auto parallization, and either instruction is a branch,
927 if (exec_type
== PACK_UNSPEC
928 && (op1
->exec_type
& ALONE
|| op2
->exec_type
& ALONE
))
931 /* The idea here is to create two sets of bitmasks (mod and used)
932 which indicate which registers are modified or used by each
933 instruction. The operation can only be done in parallel if
934 instruction 1 and instruction 2 modify different registers, and
935 the first instruction does not modify registers that the second
936 is using (The second instruction can modify registers that the
937 first is using as they are only written back after the first
938 instruction has completed). Accesses to control registers, PSW,
939 and memory are treated as accesses to a single register. So if
940 both instructions write memory or if the first instruction writes
941 memory and the second reads, then they cannot be done in
942 parallel. Likewise, if the first instruction mucks with the psw
943 and the second reads the PSW (which includes C, F0, and F1), then
944 they cannot operate safely in parallel. */
946 /* the bitmasks (mod and used) look like this (bit 31 = MSB) */
949 /* cr (not psw) 18 */
965 mod
[j
] = used
[j
] = 0;
966 if (op
->exec_type
& BRANCH_LINK
)
969 for (i
= 0; op
->operands
[i
]; i
++)
971 flags
= d10v_operands
[op
->operands
[i
]].flags
;
972 shift
= d10v_operands
[op
->operands
[i
]].shift
;
973 mask
= 0x7FFFFFFF >> (31 - d10v_operands
[op
->operands
[i
]].bits
);
974 if (flags
& OPERAND_REG
)
976 regno
= (ins
>> shift
) & mask
;
977 if (flags
& (OPERAND_ACC0
|OPERAND_ACC1
))
979 else if (flags
& OPERAND_CONTROL
) /* mvtc or mvfc */
986 else if (flags
& (OPERAND_FFLAG
|OPERAND_CFLAG
))
989 if ( flags
& OPERAND_DEST
)
991 mod
[j
] |= 1 << regno
;
992 if (flags
& OPERAND_EVEN
)
993 mod
[j
] |= 1 << (regno
+ 1);
997 used
[j
] |= 1 << regno
;
998 if (flags
& OPERAND_EVEN
)
999 used
[j
] |= 1 << (regno
+ 1);
1001 /* Auto inc/dec also modifies the register. */
1002 if (op
->operands
[i
+1] != 0
1003 && (d10v_operands
[op
->operands
[i
+1]].flags
1004 & (OPERAND_PLUS
| OPERAND_MINUS
)) != 0)
1005 mod
[j
] |= 1 << regno
;
1008 else if (flags
& OPERAND_ATMINUS
)
1010 /* SP implicitly used/modified */
1015 if (op
->exec_type
& RMEM
)
1017 else if (op
->exec_type
& WMEM
)
1019 else if (op
->exec_type
& RF0
)
1021 else if (op
->exec_type
& WF0
)
1023 else if (op
->exec_type
& WCAR
)
1026 if ((mod
[0] & mod
[1]) == 0 && (mod
[0] & used
[1]) == 0)
1032 /* This is the main entry point for the machine-dependent assembler. str points to a
1033 machine-dependent instruction. This function is supposed to emit the frags/bytes
1034 it assembles to. For the D10V, it mostly handles the special VLIW parsing and packing
1035 and leaves the difficult stuff to do_assemble().
1038 static unsigned long prev_insn
;
1039 static struct d10v_opcode
*prev_opcode
= 0;
1040 static subsegT prev_subseg
;
1041 static segT prev_seg
= 0;;
1047 /* etype is saved extype. for multiline instructions */
1049 packing_type extype
= PACK_UNSPEC
; /* parallel, etc */
1051 struct d10v_opcode
* opcode
;
1055 if (etype
== PACK_UNSPEC
)
1057 /* look for the special multiple instruction separators */
1058 str2
= strstr (str
, "||");
1060 extype
= PACK_PARALLEL
;
1063 str2
= strstr (str
, "->");
1065 extype
= PACK_LEFT_RIGHT
;
1068 str2
= strstr (str
, "<-");
1070 extype
= PACK_RIGHT_LEFT
;
1073 /* str2 points to the separator, if one */
1078 /* if two instructions are present and we already have one saved
1079 then first write out the save one */
1082 /* assemble first instruction and save it */
1083 prev_insn
= do_assemble (str
, &prev_opcode
);
1084 if (prev_insn
== -1)
1085 as_fatal (_("can't find opcode "));
1086 fixups
= fixups
->next
;
1091 insn
= do_assemble (str
, &opcode
);
1094 if (extype
!= PACK_UNSPEC
)
1099 as_fatal (_("can't find opcode "));
1102 if (etype
!= PACK_UNSPEC
)
1105 etype
= PACK_UNSPEC
;
1108 /* if this is a long instruction, write it and any previous short instruction */
1109 if (opcode
->format
& LONG_OPCODE
)
1111 if (extype
!= PACK_UNSPEC
)
1112 as_fatal (_("Unable to mix instructions as specified"));
1114 write_long (opcode
, insn
, fixups
);
1119 if (prev_opcode
&& prev_seg
&& ((prev_seg
!= now_seg
) || (prev_subseg
!= now_subseg
)))
1122 if (prev_opcode
&& (write_2_short (prev_opcode
, prev_insn
, opcode
, insn
, extype
, fixups
) == 0))
1124 /* no instructions saved */
1129 if (extype
!= PACK_UNSPEC
)
1130 as_fatal (_("Unable to mix instructions as specified"));
1131 /* save off last instruction so it may be packed on next pass */
1132 prev_opcode
= opcode
;
1135 prev_subseg
= now_subseg
;
1136 fixups
= fixups
->next
;
1141 /* do_assemble assembles a single instruction and returns an opcode */
1142 /* it returns -1 (an invalid opcode) on error */
1144 static unsigned long
1145 do_assemble (str
, opcode
)
1147 struct d10v_opcode
**opcode
;
1149 unsigned char *op_start
, *save
;
1150 unsigned char *op_end
;
1153 expressionS myops
[6];
1156 /* Drop leading whitespace. */
1160 /* Find the opcode end. */
1161 for (op_start
= op_end
= (unsigned char *) (str
);
1164 && !is_end_of_line
[*op_end
] && *op_end
!= ' ';
1167 name
[nlen
] = tolower (op_start
[nlen
]);
1175 /* Find the first opcode with the proper name. */
1176 *opcode
= (struct d10v_opcode
*)hash_find (d10v_hash
, name
);
1177 if (*opcode
== NULL
)
1178 as_fatal (_("unknown opcode: %s"),name
);
1180 save
= input_line_pointer
;
1181 input_line_pointer
= op_end
;
1182 *opcode
= find_opcode (*opcode
, myops
);
1185 input_line_pointer
= save
;
1187 insn
= build_insn ((*opcode
), myops
, 0);
1191 /* Find the symbol which has the same name as the register in the given expression. */
1193 find_symbol_matching_register (exp
)
1198 if (exp
->X_op
!= O_register
)
1201 /* Find the name of the register. */
1202 for (i
= d10v_reg_name_cnt (); i
--;)
1203 if (d10v_predefined_registers
[i
].value
== exp
->X_add_number
)
1209 /* Now see if a symbol has been defined with the same name. */
1210 return symbol_find (d10v_predefined_registers
[i
].name
);
1214 /* find_opcode() gets a pointer to an entry in the opcode table. */
1215 /* It must look at all opcodes with the same name and use the operands */
1216 /* to choose the correct opcode. */
1218 static struct d10v_opcode
*
1219 find_opcode (opcode
, myops
)
1220 struct d10v_opcode
*opcode
;
1221 expressionS myops
[];
1224 struct d10v_opcode
*next_opcode
;
1226 /* get all the operands and save them as expressions */
1227 get_operands (myops
);
1229 /* now see if the operand is a fake. If so, find the correct size */
1230 /* instruction, if possible */
1231 if (opcode
->format
== OPCODE_FAKE
)
1233 int opnum
= opcode
->operands
[0];
1236 if (myops
[opnum
].X_op
== O_register
)
1238 myops
[opnum
].X_op
= O_symbol
;
1239 myops
[opnum
].X_add_symbol
= symbol_find_or_make ((char *)myops
[opnum
].X_op_symbol
);
1240 myops
[opnum
].X_add_number
= 0;
1241 myops
[opnum
].X_op_symbol
= NULL
;
1244 next_opcode
=opcode
+1;
1246 /* If the first operand is supposed to be a register, make sure
1247 we got a valid one. */
1248 flags
= d10v_operands
[next_opcode
->operands
[0]].flags
;
1249 if (flags
& OPERAND_REG
)
1251 int X_op
= myops
[0].X_op
;
1252 int num
= myops
[0].X_add_number
;
1254 if (X_op
!= O_register
1256 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1257 | OPERAND_FFLAG
| OPERAND_CFLAG
| OPERAND_CONTROL
)))
1259 as_bad (_("bad opcode or operands"));
1264 if (myops
[opnum
].X_op
== O_constant
|| (myops
[opnum
].X_op
== O_symbol
&&
1265 S_IS_DEFINED(myops
[opnum
].X_add_symbol
) &&
1266 (S_GET_SEGMENT(myops
[opnum
].X_add_symbol
) == now_seg
)))
1268 for (i
=0; opcode
->operands
[i
+1]; i
++)
1270 int bits
= d10v_operands
[next_opcode
->operands
[opnum
]].bits
;
1271 int flags
= d10v_operands
[next_opcode
->operands
[opnum
]].flags
;
1272 if (flags
& OPERAND_ADDR
)
1275 if (myops
[opnum
].X_op
== O_constant
)
1277 if (!check_range (myops
[opnum
].X_add_number
, bits
, flags
))
1284 unsigned long current_position
;
1285 unsigned long symbol_position
;
1286 unsigned long value
;
1287 boolean found_symbol
;
1289 /* Calculate the address of the current instruction
1290 and the address of the symbol. Do this by summing
1291 the offsets of previous frags until we reach the
1292 frag containing the symbol, and the current frag. */
1293 sym_frag
= symbol_get_frag (myops
[opnum
].X_add_symbol
);
1294 found_symbol
= false;
1296 current_position
= obstack_next_free (&frchain_now
->frch_obstack
) - frag_now
->fr_literal
;
1297 symbol_position
= S_GET_VALUE (myops
[opnum
].X_add_symbol
);
1299 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
1301 current_position
+= f
->fr_fix
+ f
->fr_offset
;
1304 found_symbol
= true;
1307 symbol_position
+= f
->fr_fix
+ f
->fr_offset
;
1310 value
= symbol_position
;
1312 if (flags
& OPERAND_ADDR
)
1313 value
-= current_position
;
1315 if (AT_WORD_P (&myops
[opnum
]))
1320 if (!check_range (value
, bits
, flags
))
1324 else if (!check_range (value
, bits
, flags
))
1329 as_fatal (_("value out of range"));
1333 /* not a constant, so use a long instruction */
1340 /* now search the opcode table table for one with operands */
1341 /* that matches what we've got */
1345 for (i
= 0; opcode
->operands
[i
]; i
++)
1347 int flags
= d10v_operands
[opcode
->operands
[i
]].flags
;
1348 int X_op
= myops
[i
].X_op
;
1349 int num
= myops
[i
].X_add_number
;
1357 if (flags
& OPERAND_REG
)
1359 if ((X_op
!= O_register
)
1361 & (OPERAND_GPR
| OPERAND_ACC0
| OPERAND_ACC1
1362 | OPERAND_FFLAG
| OPERAND_CFLAG
1363 | OPERAND_CONTROL
)))
1370 if (((flags
& OPERAND_MINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_MINUS
))) ||
1371 ((flags
& OPERAND_PLUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_PLUS
))) ||
1372 ((flags
& OPERAND_ATMINUS
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATMINUS
))) ||
1373 ((flags
& OPERAND_ATPAR
) && ((X_op
!= O_absent
) || (num
!= OPERAND_ATPAR
))) ||
1374 ((flags
& OPERAND_ATSIGN
) && ((X_op
!= O_absent
) || ((num
!= OPERAND_ATSIGN
) && (num
!= OPERAND_ATPAR
)))))
1380 /* Unfortunatly, for the indirect operand in instructions such as
1381 ``ldb r1, @(c,r14)'' this function can be passed X_op == O_register
1382 (because 'c' is a valid register name). However we cannot just
1383 ignore the case when X_op == O_register but flags & OPERAND_REG is
1384 null, so we check to see if a symbol of the same name as the register
1385 exists. If the symbol does exist, then the parser was unable to
1386 distinguish the two cases and we fix things here. (Ref: PR14826) */
1388 if (!(flags
& OPERAND_REG
) && (X_op
== O_register
))
1392 sym
= find_symbol_matching_register (& myops
[i
]);
1396 myops
[i
].X_op
== X_op
== O_symbol
;
1397 myops
[i
].X_add_symbol
= sym
;
1401 (_("illegal operand - register name found where none expected"));
1405 /* We're only done if the operands matched so far AND there
1406 are no more to check. */
1407 if (match
&& myops
[i
].X_op
== 0)
1412 next_opcode
= opcode
+ 1;
1414 if (next_opcode
->opcode
== 0)
1417 if (strcmp (next_opcode
->name
, opcode
->name
))
1420 opcode
= next_opcode
;
1426 as_bad (_("bad opcode or operands"));
1430 /* Check that all registers that are required to be even are. */
1431 /* Also, if any operands were marked as registers, but were really symbols */
1432 /* fix that here. */
1433 for (i
=0; opcode
->operands
[i
]; i
++)
1435 if ((d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_EVEN
) &&
1436 (myops
[i
].X_add_number
& 1))
1437 as_fatal (_("Register number must be EVEN"));
1438 if (myops
[i
].X_op
== O_register
)
1440 if (!(d10v_operands
[opcode
->operands
[i
]].flags
& OPERAND_REG
))
1442 myops
[i
].X_op
= O_symbol
;
1443 myops
[i
].X_add_symbol
= symbol_find_or_make ((char *)myops
[i
].X_op_symbol
);
1444 myops
[i
].X_add_number
= 0;
1445 myops
[i
].X_op_symbol
= NULL
;
1452 /* if while processing a fixup, a reloc really needs to be created */
1453 /* then it is done here */
1456 tc_gen_reloc (seg
, fixp
)
1461 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1462 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1463 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1464 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1465 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1466 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1468 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1469 _("reloc %d not supported by object file format"), (int)fixp
->fx_r_type
);
1473 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1474 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1475 reloc
->address
= fixp
->fx_offset
;
1477 reloc
->addend
= fixp
->fx_addnumber
;
1483 md_estimate_size_before_relax (fragp
, seg
)
1492 md_pcrel_from_section (fixp
, sec
)
1496 if (fixp
->fx_addsy
!= (symbolS
*)NULL
&& (!S_IS_DEFINED (fixp
->fx_addsy
) ||
1497 (S_GET_SEGMENT (fixp
->fx_addsy
) != sec
)))
1499 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1503 md_apply_fix3 (fixp
, valuep
, seg
)
1514 if (fixp
->fx_addsy
== (symbolS
*) NULL
)
1519 else if (fixp
->fx_pcrel
)
1523 value
= fixp
->fx_offset
;
1524 if (fixp
->fx_subsy
!= (symbolS
*) NULL
)
1526 if (S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
1527 value
-= S_GET_VALUE (fixp
->fx_subsy
);
1530 /* We don't actually support subtracting a symbol. */
1531 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1532 _("expression too complex"));
1537 op_type
= fixp
->fx_r_type
;
1544 fixp
->fx_r_type
= BFD_RELOC_D10V_10_PCREL_L
;
1547 else if (op_type
& 4096)
1550 fixp
->fx_r_type
= BFD_RELOC_D10V_18
;
1553 fixp
->fx_r_type
= get_reloc((struct d10v_operand
*)&d10v_operands
[op_type
]);
1556 /* Fetch the instruction, insert the fully resolved operand
1557 value, and stuff the instruction back again. */
1558 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
1559 insn
= bfd_getb32 ((unsigned char *) where
);
1561 switch (fixp
->fx_r_type
)
1563 case BFD_RELOC_D10V_10_PCREL_L
:
1564 case BFD_RELOC_D10V_10_PCREL_R
:
1565 case BFD_RELOC_D10V_18_PCREL
:
1566 case BFD_RELOC_D10V_18
:
1567 /* instruction addresses are always right-shifted by 2 */
1568 value
>>= AT_WORD_RIGHT_SHIFT
;
1569 if (fixp
->fx_size
== 2)
1570 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1573 struct d10v_opcode
*rep
, *repi
;
1575 rep
= (struct d10v_opcode
*) hash_find (d10v_hash
, "rep");
1576 repi
= (struct d10v_opcode
*) hash_find (d10v_hash
, "repi");
1577 if ((insn
& FM11
) == FM11
1578 && ((repi
!= NULL
&& (insn
& repi
->mask
) == repi
->opcode
)
1579 || (rep
!= NULL
&& (insn
& rep
->mask
) == rep
->opcode
))
1582 (_("line %d: rep or repi must include at least 4 instructions"),
1584 insn
= d10v_insert_operand (insn
, op_type
, (offsetT
)value
, left
, fixp
);
1585 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
1589 bfd_putb32 ((bfd_vma
) value
, (unsigned char *) where
);
1592 bfd_putb16 ((bfd_vma
) value
, (unsigned char *) where
);
1595 case BFD_RELOC_VTABLE_INHERIT
:
1596 case BFD_RELOC_VTABLE_ENTRY
:
1601 as_fatal (_("line %d: unknown relocation type: 0x%x"),fixp
->fx_line
,fixp
->fx_r_type
);
1606 /* d10v_cleanup() is called after the assembler has finished parsing the input
1607 file or after a label is defined. Because the D10V assembler sometimes saves short
1608 instructions to see if it can package them with the next instruction, there may
1609 be a short instruction that still needs written.
1610 NOTE: accesses a global, etype.
1611 NOTE: invoked by various macros such as md_cleanup: see. */
1618 if (prev_opcode
&& etype
== PACK_UNSPEC
)
1621 subseg
= now_subseg
;
1623 subseg_set (prev_seg
, prev_subseg
);
1624 write_1_short (prev_opcode
, prev_insn
, fixups
->next
);
1625 subseg_set (seg
, subseg
);
1631 /* Like normal .word, except support @word */
1632 /* clobbers input_line_pointer, checks end-of-line. */
1634 d10v_dot_word (nbytes
)
1635 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
1638 bfd_reloc_code_real_type reloc
;
1642 if (is_it_end_of_statement ())
1644 demand_empty_rest_of_line ();
1651 if (!strncasecmp (input_line_pointer
, "@word", 5))
1653 exp
.X_add_number
= 0;
1654 input_line_pointer
+= 5;
1657 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 2,
1658 &exp
, 0, BFD_RELOC_D10V_18
);
1661 emit_expr (&exp
, 2);
1663 while (*input_line_pointer
++ == ',');
1665 input_line_pointer
--; /* Put terminator back into stream. */
1666 demand_empty_rest_of_line ();
1670 /* Mitsubishi asked that we support some old syntax that apparently */
1671 /* had immediate operands starting with '#'. This is in some of their */
1672 /* sample code but is not documented (although it appears in some */
1673 /* examples in their assembler manual). For now, we'll solve this */
1674 /* compatibility problem by simply ignoring any '#' at the beginning */
1675 /* of an operand. */
1677 /* operands that begin with '#' should fall through to here */
1681 md_operand (expressionP
)
1682 expressionS
*expressionP
;
1684 if (*input_line_pointer
== '#' && ! do_not_ignore_hash
)
1686 input_line_pointer
++;
1687 expression (expressionP
);
1692 d10v_fix_adjustable (fixP
)
1696 if (fixP
->fx_addsy
== NULL
)
1699 /* Prevent all adjustments to global symbols. */
1700 if (S_IS_EXTERN (fixP
->fx_addsy
))
1702 if (S_IS_WEAK (fixP
->fx_addsy
))
1705 /* We need the symbol name for the VTABLE entries */
1706 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1707 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1714 d10v_force_relocation (fixp
)
1717 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1718 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)