1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
3 Copyright (C) 1996, 1997 Free Software Foundation.
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. */
26 #include "opcode/d10v.h"
29 const char comment_chars[] = ";";
30 const char line_comment_chars[] = "#";
31 const char line_separator_chars[] = "";
32 const char *md_shortopts = "O";
33 const char EXP_CHARS[] = "eE";
34 const char FLT_CHARS[] = "dD";
41 #define MAX_INSN_FIXUPS (5)
48 bfd_reloc_code_real_type reloc;
51 typedef struct _fixups
54 struct d10v_fixup fix[MAX_INSN_FIXUPS];
58 static Fixups FixUps[2];
59 static Fixups *fixups;
62 static int reg_name_search PARAMS ((char *name));
63 static int register_name PARAMS ((expressionS *expressionP));
64 static int check_range PARAMS ((unsigned long num, int bits, int flags));
65 static int postfix PARAMS ((char *p));
66 static bfd_reloc_code_real_type get_reloc PARAMS ((struct d10v_operand *op));
67 static int get_operands PARAMS ((expressionS exp[]));
68 static struct d10v_opcode *find_opcode PARAMS ((struct d10v_opcode *opcode, expressionS ops[]));
69 static unsigned long build_insn PARAMS ((struct d10v_opcode *opcode, expressionS *opers, unsigned long insn));
70 static void write_long PARAMS ((struct d10v_opcode *opcode, unsigned long insn, Fixups *fx));
71 static void write_1_short PARAMS ((struct d10v_opcode *opcode, unsigned long insn, Fixups *fx));
72 static int write_2_short PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1,
73 struct d10v_opcode *opcode2, unsigned long insn2, int exec_type, Fixups *fx));
74 static unsigned long do_assemble PARAMS ((char *str, struct d10v_opcode **opcode));
75 static unsigned long d10v_insert_operand PARAMS (( unsigned long insn, int op_type,
76 offsetT value, int left, fixS *fix));
77 static int parallel_ok PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1,
78 struct d10v_opcode *opcode2, unsigned long insn2,
81 struct option md_longopts[] = {
82 {NULL, no_argument, NULL, 0}
84 size_t md_longopts_size = sizeof(md_longopts);
86 static void d10v_dot_word PARAMS ((int));
88 /* The target specific pseudo-ops which we support. */
89 const pseudo_typeS md_pseudo_table[] =
91 { "word", d10v_dot_word, 2 },
95 /* Opcode hash table. */
96 static struct hash_control *d10v_hash;
98 /* reg_name_search does a binary search of the d10v_predefined_registers
99 array to see if "name" is a valid regiter name. Returns the register
100 number from the array on success, or -1 on failure. */
103 reg_name_search (name)
106 int middle, low, high;
110 high = d10v_reg_name_cnt() - 1;
114 middle = (low + high) / 2;
115 cmp = strcasecmp (name, d10v_predefined_registers[middle].name);
121 return d10v_predefined_registers[middle].value;
127 /* register_name() checks the string at input_line_pointer
128 to see if it is a valid register name */
131 register_name (expressionP)
132 expressionS *expressionP;
135 char c, *p = input_line_pointer;
137 while (*p && *p!='\n' && *p!='\r' && *p !=',' && *p!=' ' && *p!=')')
144 /* look to see if it's in the register table */
145 reg_number = reg_name_search (input_line_pointer);
148 expressionP->X_op = O_register;
149 /* temporarily store a pointer to the string here */
150 expressionP->X_op_symbol = (struct symbol *)input_line_pointer;
151 expressionP->X_add_number = reg_number;
152 input_line_pointer = p;
162 check_range (num, bits, flags)
170 /* don't bother checking 16-bit values */
174 if (flags & OPERAND_SHIFT)
176 /* all special shift operands are unsigned */
177 /* and <= 16. We allow 0 for now. */
184 if (flags & OPERAND_SIGNED)
186 max = (1 << (bits - 1))-1;
187 min = - (1 << (bits - 1));
188 if (((long)num > max) || ((long)num < min))
193 max = (1 << bits) - 1;
195 if ((num > max) || (num < min))
203 md_show_usage (stream)
206 fprintf(stream, "D10V options:\n\
207 -O optimize. Will do some operations in parallel.\n");
211 md_parse_option (c, arg)
218 /* Optimize. Will attempt to parallelize operations */
228 md_undefined_symbol (name)
234 /* Turn a string in input_line_pointer into a floating point constant of type
235 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
236 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
239 md_atof (type, litP, sizeP)
245 LITTLENUM_TYPE words[4];
259 return "bad call to md_atof";
262 t = atof_ieee (input_line_pointer, type, words);
264 input_line_pointer = t;
268 for (i = 0; i < prec; i++)
270 md_number_to_chars (litP, (valueT) words[i], 2);
277 md_convert_frag (abfd, sec, fragP)
286 md_section_align (seg, addr)
290 int align = bfd_get_section_alignment (stdoutput, seg);
291 return ((addr + (1 << align) - 1) & (-1 << align));
298 char *prev_name = "";
299 struct d10v_opcode *opcode;
300 d10v_hash = hash_new();
302 /* Insert unique names into hash table. The D10v instruction set
303 has many identical opcode names that have different opcodes based
304 on the operands. This hash table then provides a quick index to
305 the first opcode with a particular name in the opcode table. */
307 for (opcode = (struct d10v_opcode *)d10v_opcodes; opcode->name; opcode++)
309 if (strcmp (prev_name, opcode->name))
311 prev_name = (char *)opcode->name;
312 hash_insert (d10v_hash, opcode->name, (char *) opcode);
317 FixUps[0].next = &FixUps[1];
318 FixUps[1].next = &FixUps[0];
322 /* this function removes the postincrement or postdecrement
323 operator ( '+' or '-' ) from an expression */
325 static int postfix (p)
328 while (*p != '-' && *p != '+')
330 if (*p==0 || *p=='\n' || *p=='\r')
350 static bfd_reloc_code_real_type
352 struct d10v_operand *op;
359 if (op->flags & OPERAND_ADDR)
362 return (BFD_RELOC_D10V_10_PCREL_R);
364 return (BFD_RELOC_D10V_18_PCREL);
367 return (BFD_RELOC_16);
371 /* get_operands parses a string of operands and returns
372 an array of expressions */
378 char *p = input_line_pointer;
384 while (*p == ' ' || *p == '\t' || *p == ',')
386 if (*p==0 || *p=='\n' || *p=='\r')
392 exp[numops].X_op = O_absent;
396 exp[numops].X_add_number = OPERAND_ATPAR;
401 exp[numops].X_add_number = OPERAND_ATMINUS;
405 exp[numops].X_add_number = OPERAND_ATSIGN;
414 /* just skip the trailing paren */
419 input_line_pointer = p;
421 /* check to see if it might be a register name */
422 if (!register_name (&exp[numops]))
424 /* parse as an expression */
425 expression (&exp[numops]);
428 if (!strncasecmp (input_line_pointer, "@word", 5))
430 if (exp[numops].X_op == O_register)
432 /* if it looked like a register name but was followed by "@word" */
433 /* then it was really a symbol, so change it to one */
434 exp[numops].X_op = O_symbol;
435 exp[numops].X_add_symbol = symbol_find_or_make ((char *)exp[numops].X_op_symbol);
437 exp[numops].X_op_symbol = (struct symbol *)-1;
438 exp[numops].X_add_number = AT_WORD;
439 input_line_pointer += 5;
442 if (exp[numops].X_op == O_illegal)
443 as_bad ("illegal operand");
444 else if (exp[numops].X_op == O_absent)
445 as_bad ("missing operand");
448 p = input_line_pointer;
453 case -1: /* postdecrement mode */
454 exp[numops].X_op = O_absent;
455 exp[numops++].X_add_number = OPERAND_MINUS;
457 case 1: /* postincrement mode */
458 exp[numops].X_op = O_absent;
459 exp[numops++].X_add_number = OPERAND_PLUS;
463 exp[numops].X_op = 0;
468 d10v_insert_operand (insn, op_type, value, left, fix)
477 shift = d10v_operands[op_type].shift;
481 bits = d10v_operands[op_type].bits;
483 /* truncate to the proper number of bits */
484 if (check_range (value, bits, d10v_operands[op_type].flags))
485 as_bad_where (fix->fx_file, fix->fx_line, "operand out of range: %d", value);
487 value &= 0x7FFFFFFF >> (31 - bits);
488 insn |= (value << shift);
494 /* build_insn takes a pointer to the opcode entry in the opcode table
495 and the array of operand expressions and returns the instruction */
498 build_insn (opcode, opers, insn)
499 struct d10v_opcode *opcode;
503 int i, bits, shift, flags, format;
504 unsigned long number;
506 /* the insn argument is only used for the DIVS kludge */
511 insn = opcode->opcode;
512 format = opcode->format;
515 for (i=0;opcode->operands[i];i++)
517 flags = d10v_operands[opcode->operands[i]].flags;
518 bits = d10v_operands[opcode->operands[i]].bits;
519 shift = d10v_operands[opcode->operands[i]].shift;
520 number = opers[i].X_add_number;
522 if (flags & OPERAND_REG)
524 number &= REGISTER_MASK;
525 if (format == LONG_L)
529 if (opers[i].X_op != O_register && opers[i].X_op != O_constant)
531 /* now create a fixup */
533 if (fixups->fc >= MAX_INSN_FIXUPS)
534 as_fatal ("too many fixups");
536 if (opers[i].X_op == O_symbol && number == AT_WORD &&
537 opers[i].X_op_symbol == (struct symbol *)-1 )
539 number = opers[i].X_add_number = 0;
540 fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18;
542 fixups->fix[fixups->fc].reloc =
543 get_reloc((struct d10v_operand *)&d10v_operands[opcode->operands[i]]);
545 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 ||
546 fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18)
547 fixups->fix[fixups->fc].size = 2;
549 fixups->fix[fixups->fc].size = 4;
551 fixups->fix[fixups->fc].exp = opers[i];
552 fixups->fix[fixups->fc].operand = opcode->operands[i];
553 fixups->fix[fixups->fc].pcrel = (flags & OPERAND_ADDR) ? true : false;
557 /* truncate to the proper number of bits */
558 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
559 as_bad("operand out of range: %d",number);
560 number &= 0x7FFFFFFF >> (31 - bits);
561 insn = insn | (number << shift);
564 /* kludge: for DIVS, we need to put the operands in twice */
565 /* on the second pass, format is changed to LONG_R to force */
566 /* the second set of operands to not be shifted over 15 */
567 if ((opcode->opcode == OPCODE_DIVS) && (format==LONG_L))
568 insn = build_insn (opcode, opers, insn);
573 /* write out a long form instruction */
575 write_long (opcode, insn, fx)
576 struct d10v_opcode *opcode;
581 char *f = frag_more(4);
584 number_to_chars_bigendian (f, insn, 4);
586 for (i=0; i < fx->fc; i++)
588 if (fx->fix[i].reloc)
590 where = f - frag_now->fr_literal;
591 if (fx->fix[i].size == 2)
594 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
595 fx->fix[i].operand |= 4096;
597 fix_new_exp (frag_now,
602 fx->fix[i].operand|2048);
609 /* write out a short form instruction by itself */
611 write_1_short (opcode, insn, fx)
612 struct d10v_opcode *opcode;
616 char *f = frag_more(4);
619 if (opcode->exec_type & PARONLY)
620 as_fatal ("Instruction must be executed in parallel with another instruction.");
622 /* the other container needs to be NOP */
623 /* according to 4.3.1: for FM=00, sub-instructions performed only
624 by IU cannot be encoded in L-container. */
625 if (opcode->unit == IU)
626 insn |= FM00 | (NOP << 15); /* right container */
628 insn = FM00 | (insn << 15) | NOP; /* left container */
630 number_to_chars_bigendian (f, insn, 4);
631 for (i=0; i < fx->fc; i++)
633 if (fx->fix[i].reloc)
635 where = f - frag_now->fr_literal;
636 if (fx->fix[i].size == 2)
639 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
640 fx->fix[i].operand |= 4096;
642 /* if it's an R reloc, we may have to switch it to L */
643 if ( (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) && (opcode->unit != IU) )
644 fx->fix[i].operand |= 1024;
646 fix_new_exp (frag_now,
651 fx->fix[i].operand|2048);
657 /* write out a short form instruction if possible */
658 /* return number of instructions not written out */
660 write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
661 struct d10v_opcode *opcode1, *opcode2;
662 unsigned long insn1, insn2;
670 if ( (exec_type != 1) && ((opcode1->exec_type & PARONLY)
671 || (opcode2->exec_type & PARONLY)))
672 as_fatal("Instruction must be executed in parallel");
674 if ( (opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
675 as_fatal ("Long instructions may not be combined.");
677 if(opcode1->exec_type & BRANCH_LINK && exec_type == 0)
679 /* Instructions paired with a subroutine call are executed before the
680 subroutine, so don't do these pairings unless explicitly requested. */
681 write_1_short (opcode1, insn1, fx->next);
687 case 0: /* order not specified */
688 if ( Optimizing && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
691 if (opcode1->unit == IU)
692 insn = FM00 | (insn2 << 15) | insn1;
693 else if (opcode2->unit == MU)
694 insn = FM00 | (insn2 << 15) | insn1;
697 insn = FM00 | (insn1 << 15) | insn2;
701 else if (opcode1->unit == IU)
703 /* reverse sequential */
704 insn = FM10 | (insn2 << 15) | insn1;
709 insn = FM01 | (insn1 << 15) | insn2;
713 case 1: /* parallel */
714 if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ)
715 as_fatal ("One of these instructions may not be executed in parallel.");
717 if (opcode1->unit == IU)
719 if (opcode2->unit == IU)
720 as_fatal ("Two IU instructions may not be executed in parallel");
721 if (flag_warn_instructionswap)
722 as_warn ("Swapping instruction order");
723 insn = FM00 | (insn2 << 15) | insn1;
725 else if (opcode2->unit == MU)
727 if (opcode1->unit == MU)
728 as_fatal ("Two MU instructions may not be executed in parallel");
729 if (flag_warn_instructionswap)
730 as_warn ("Swapping instruction order");
731 insn = FM00 | (insn2 << 15) | insn1;
735 insn = FM00 | (insn1 << 15) | insn2;
739 case 2: /* sequential */
740 if (opcode1->unit == IU)
741 as_fatal ("IU instruction may not be in the left container");
742 insn = FM01 | (insn1 << 15) | insn2;
745 case 3: /* reverse sequential */
746 if (opcode2->unit == MU)
747 as_fatal ("MU instruction may not be in the right container");
748 insn = FM10 | (insn1 << 15) | insn2;
752 as_fatal("unknown execution type passed to write_2_short()");
756 number_to_chars_bigendian (f, insn, 4);
760 for (i=0; i < fx->fc; i++)
762 if (fx->fix[i].reloc)
764 where = f - frag_now->fr_literal;
765 if (fx->fix[i].size == 2)
768 if ( (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) && (j == 0) )
769 fx->fix[i].operand |= 1024;
771 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
772 fx->fix[i].operand |= 4096;
774 fix_new_exp (frag_now,
779 fx->fix[i].operand|2048);
789 /* Check 2 instructions and determine if they can be safely */
790 /* executed in parallel. Returns 1 if they can be. */
792 parallel_ok (op1, insn1, op2, insn2, exec_type)
793 struct d10v_opcode *op1, *op2;
794 unsigned long insn1, insn2;
797 int i, j, flags, mask, shift, regno;
798 unsigned long ins, mod[2], used[2];
799 struct d10v_opcode *op;
801 if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
802 || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
803 || (op1->unit == BOTH) || (op2->unit == BOTH)
804 || (op1->unit == IU && op2->unit == IU)
805 || (op1->unit == MU && op2->unit == MU))
808 /* If the first instruction is a branch and this is auto parallazation,
809 don't combine with any second instruction. */
810 if (exec_type == 0 && (op1->exec_type & BRANCH) != 0)
813 /* The idea here is to create two sets of bitmasks (mod and used)
814 which indicate which registers are modified or used by each
815 instruction. The operation can only be done in parallel if
816 instruction 1 and instruction 2 modify different registers, and
817 the first instruction does not modify registers that the second
818 is using (The second instruction can modify registers that the
819 first is using as they are only written back after the first
820 instruction has completed). Accesses to control registers, PSW,
821 and memory are treated as accesses to a single register. So if
822 both instructions write memory or if the first instruction writes
823 memory and the second reads, then they cannot be done in
824 parallel. Likewise, if the first instruction mucks with the psw
825 and the second reads the PSW (which includes C, F0, and F1), then
826 they cannot operate safely in parallel. */
828 /* the bitmasks (mod and used) look like this (bit 31 = MSB) */
831 /* cr (not psw) 18 */
847 mod[j] = used[j] = 0;
848 if (op->exec_type & BRANCH_LINK)
851 for (i = 0; op->operands[i]; i++)
853 flags = d10v_operands[op->operands[i]].flags;
854 shift = d10v_operands[op->operands[i]].shift;
855 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
856 if (flags & OPERAND_REG)
858 regno = (ins >> shift) & mask;
859 if (flags & OPERAND_ACC)
861 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */
868 else if (flags & (OPERAND_FFLAG|OPERAND_CFLAG))
871 if ( flags & OPERAND_DEST )
873 mod[j] |= 1 << regno;
874 if (flags & OPERAND_EVEN)
875 mod[j] |= 1 << (regno + 1);
879 used[j] |= 1 << regno ;
880 if (flags & OPERAND_EVEN)
881 used[j] |= 1 << (regno + 1);
883 /* Auto inc/dec also modifies the register. */
884 if (op->operands[i+1] != 0
885 && (d10v_operands[op->operands[i+1]].flags
886 & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
887 mod[j] |= 1 << regno;
890 else if (flags & OPERAND_ATMINUS)
892 /* SP implicitly used/modified */
897 if (op->exec_type & RMEM)
899 else if (op->exec_type & WMEM)
901 else if (op->exec_type & RF0)
903 else if (op->exec_type & WF0)
905 else if (op->exec_type & WCAR)
908 if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0)
914 /* This is the main entry point for the machine-dependent assembler. str points to a
915 machine-dependent instruction. This function is supposed to emit the frags/bytes
916 it assembles to. For the D10V, it mostly handles the special VLIW parsing and packing
917 and leaves the difficult stuff to do_assemble().
920 static unsigned long prev_insn;
921 static struct d10v_opcode *prev_opcode = 0;
922 static subsegT prev_subseg;
923 static segT prev_seg = 0;;
929 struct d10v_opcode *opcode;
931 int extype=0; /* execution type; parallel, etc */
932 static int etype=0; /* saved extype. used for multiline instructions */
937 /* look for the special multiple instruction separators */
938 str2 = strstr (str, "||");
943 str2 = strstr (str, "->");
948 str2 = strstr (str, "<-");
953 /* str2 points to the separator, if one */
958 /* if two instructions are present and we already have one saved
959 then first write it out */
962 /* assemble first instruction and save it */
963 prev_insn = do_assemble (str, &prev_opcode);
965 as_fatal ("can't find opcode ");
966 fixups = fixups->next;
971 insn = do_assemble (str, &opcode);
979 as_fatal ("can't find opcode ");
988 /* if this is a long instruction, write it and any previous short instruction */
989 if (opcode->format & LONG_OPCODE)
992 as_fatal("Unable to mix instructions as specified");
994 write_long (opcode, insn, fixups);
999 if (prev_opcode && prev_seg && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1002 if (prev_opcode && (write_2_short (prev_opcode, prev_insn, opcode, insn, extype, fixups) == 0))
1004 /* no instructions saved */
1010 as_fatal("Unable to mix instructions as specified");
1011 /* save off last instruction so it may be packed on next pass */
1012 prev_opcode = opcode;
1015 prev_subseg = now_subseg;
1016 fixups = fixups->next;
1021 /* do_assemble assembles a single instruction and returns an opcode */
1022 /* it returns -1 (an invalid opcode) on error */
1024 static unsigned long
1025 do_assemble (str, opcode)
1027 struct d10v_opcode **opcode;
1029 unsigned char *op_start, *save;
1030 unsigned char *op_end;
1033 expressionS myops[6];
1036 /* Drop leading whitespace */
1040 /* find the opcode end */
1041 for (op_start = op_end = (unsigned char *) (str);
1044 && !is_end_of_line[*op_end] && *op_end != ' ';
1047 name[nlen] = tolower(op_start[nlen]);
1055 /* find the first opcode with the proper name */
1056 *opcode = (struct d10v_opcode *)hash_find (d10v_hash, name);
1057 if (*opcode == NULL)
1058 as_fatal ("unknown opcode: %s",name);
1060 save = input_line_pointer;
1061 input_line_pointer = op_end;
1062 *opcode = find_opcode (*opcode, myops);
1065 input_line_pointer = save;
1067 insn = build_insn ((*opcode), myops, 0);
1071 /* find_opcode() gets a pointer to an entry in the opcode table. */
1072 /* It must look at all opcodes with the same name and use the operands */
1073 /* to choose the correct opcode. */
1075 static struct d10v_opcode *
1076 find_opcode (opcode, myops)
1077 struct d10v_opcode *opcode;
1078 expressionS myops[];
1081 struct d10v_opcode *next_opcode;
1083 /* get all the operands and save them as expressions */
1084 get_operands (myops);
1086 /* now see if the operand is a fake. If so, find the correct size */
1087 /* instruction, if possible */
1088 if (opcode->format == OPCODE_FAKE)
1090 int opnum = opcode->operands[0];
1093 if (myops[opnum].X_op == O_register)
1095 myops[opnum].X_op = O_symbol;
1096 myops[opnum].X_add_symbol = symbol_find_or_make ((char *)myops[opnum].X_op_symbol);
1097 myops[opnum].X_add_number = 0;
1098 myops[opnum].X_op_symbol = NULL;
1101 next_opcode=opcode+1;
1103 /* If the first operand is supposed to be a register, make sure
1104 we got a valid one. */
1105 flags = d10v_operands[next_opcode->operands[0]].flags;
1106 if (flags & OPERAND_REG)
1108 int X_op = myops[0].X_op;
1109 int num = myops[0].X_add_number;
1111 if (X_op != O_register
1112 || (flags & OPERAND_ACC) != (num & OPERAND_ACC)
1113 || (flags & OPERAND_FFLAG) != (num & OPERAND_FFLAG)
1114 || (flags & OPERAND_CFLAG) != (num & OPERAND_CFLAG)
1115 || (flags & OPERAND_CONTROL) != (num & OPERAND_CONTROL))
1117 as_bad ("bad opcode or operands");
1122 if (myops[opnum].X_op == O_constant || (myops[opnum].X_op == O_symbol &&
1123 S_IS_DEFINED(myops[opnum].X_add_symbol) &&
1124 (S_GET_SEGMENT(myops[opnum].X_add_symbol) == now_seg)))
1126 for (i=0; opcode->operands[i+1]; i++)
1128 int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1129 int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1130 if (flags & OPERAND_ADDR)
1132 if (myops[opnum].X_op == O_constant)
1134 if (!check_range (myops[opnum].X_add_number, bits, flags))
1141 /* calculate the current address by running through the previous frags */
1142 /* and adding our current offset */
1143 for (value = 0, f = frchain_now->frch_root; f; f = f->fr_next)
1144 value += f->fr_fix + f->fr_offset;
1146 if (flags & OPERAND_ADDR)
1147 value = S_GET_VALUE(myops[opnum].X_add_symbol) - value -
1148 (obstack_next_free(&frchain_now->frch_obstack) - frag_now->fr_literal);
1150 value = S_GET_VALUE(myops[opnum].X_add_symbol);
1152 if (myops[opnum].X_add_number == AT_WORD &&
1153 myops[opnum].X_op_symbol == (struct symbol *)-1)
1158 if (!check_range (value, bits, flags))
1162 else if (!check_range (value, bits, flags))
1167 as_fatal ("value out of range");
1171 /* not a constant, so use a long instruction */
1178 /* now search the opcode table table for one with operands */
1179 /* that matches what we've got */
1183 for (i = 0; opcode->operands[i]; i++)
1185 int flags = d10v_operands[opcode->operands[i]].flags;
1186 int X_op = myops[i].X_op;
1187 int num = myops[i].X_add_number;
1195 if (flags & OPERAND_REG)
1197 if ((X_op != O_register) ||
1198 ((flags & OPERAND_ACC) != (num & OPERAND_ACC)) ||
1199 ((flags & OPERAND_FFLAG) != (num & OPERAND_FFLAG)) ||
1200 ((flags & OPERAND_CFLAG) != (num & OPERAND_CFLAG)) ||
1201 ((flags & OPERAND_CONTROL) != (num & OPERAND_CONTROL)))
1208 if (((flags & OPERAND_MINUS) && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1209 ((flags & OPERAND_PLUS) && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1210 ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1211 ((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1212 ((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || (num != OPERAND_ATSIGN))))
1218 /* we're only done if the operands matched so far AND there
1219 are no more to check */
1220 if (match && myops[i].X_op==0)
1225 next_opcode = opcode+1;
1226 if (next_opcode->opcode == 0)
1228 if (strcmp(next_opcode->name, opcode->name))
1230 opcode = next_opcode;
1236 as_bad ("bad opcode or operands");
1240 /* Check that all registers that are required to be even are. */
1241 /* Also, if any operands were marked as registers, but were really symbols */
1242 /* fix that here. */
1243 for (i=0; opcode->operands[i]; i++)
1245 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1246 (myops[i].X_add_number & 1))
1247 as_fatal("Register number must be EVEN");
1248 if (myops[i].X_op == O_register)
1250 if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1252 myops[i].X_op = O_symbol;
1253 myops[i].X_add_symbol = symbol_find_or_make ((char *)myops[i].X_op_symbol);
1254 myops[i].X_add_number = 0;
1255 myops[i].X_op_symbol = NULL;
1262 /* if while processing a fixup, a reloc really needs to be created */
1263 /* then it is done here */
1266 tc_gen_reloc (seg, fixp)
1271 reloc = (arelent *) xmalloc (sizeof (arelent));
1272 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
1273 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1274 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1275 if (reloc->howto == (reloc_howto_type *) NULL)
1277 as_bad_where (fixp->fx_file, fixp->fx_line,
1278 "reloc %d not supported by object file format", (int)fixp->fx_r_type);
1281 reloc->addend = fixp->fx_addnumber;
1286 md_estimate_size_before_relax (fragp, seg)
1295 md_pcrel_from_section (fixp, sec)
1299 if (fixp->fx_addsy != (symbolS *)NULL && (!S_IS_DEFINED (fixp->fx_addsy) ||
1300 (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1302 return fixp->fx_frag->fr_address + fixp->fx_where;
1306 md_apply_fix3 (fixp, valuep, seg)
1317 if (fixp->fx_addsy == (symbolS *) NULL)
1322 else if (fixp->fx_pcrel)
1326 value = fixp->fx_offset;
1327 if (fixp->fx_subsy != (symbolS *) NULL)
1329 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
1330 value -= S_GET_VALUE (fixp->fx_subsy);
1333 /* We don't actually support subtracting a symbol. */
1334 as_bad_where (fixp->fx_file, fixp->fx_line,
1335 "expression too complex");
1340 op_type = fixp->fx_r_type;
1347 fixp->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1350 else if (op_type & 4096)
1353 fixp->fx_r_type = BFD_RELOC_D10V_18;
1356 fixp->fx_r_type = get_reloc((struct d10v_operand *)&d10v_operands[op_type]);
1359 /* Fetch the instruction, insert the fully resolved operand
1360 value, and stuff the instruction back again. */
1361 where = fixp->fx_frag->fr_literal + fixp->fx_where;
1362 insn = bfd_getb32 ((unsigned char *) where);
1364 switch (fixp->fx_r_type)
1366 case BFD_RELOC_D10V_10_PCREL_L:
1367 case BFD_RELOC_D10V_10_PCREL_R:
1368 case BFD_RELOC_D10V_18_PCREL:
1369 case BFD_RELOC_D10V_18:
1370 /* instruction addresses are always right-shifted by 2 */
1372 if (fixp->fx_size == 2)
1373 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1376 insn = d10v_insert_operand (insn, op_type, (offsetT)value, left, fixp);
1377 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1381 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1384 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1387 as_fatal ("line %d: unknown relocation type: 0x%x",fixp->fx_line,fixp->fx_r_type);
1392 /* d10v_cleanup() is called after the assembler has finished parsing the input
1393 file or after a label is defined. Because the D10V assembler sometimes saves short
1394 instructions to see if it can package them with the next instruction, there may
1395 be a short instruction that still needs written. */
1405 subseg = now_subseg;
1406 subseg_set (prev_seg, prev_subseg);
1407 write_1_short (prev_opcode, prev_insn, fixups->next);
1408 subseg_set (seg, subseg);
1414 /* Like normal .word, except support @word */
1415 /* clobbers input_line_pointer, checks end-of-line. */
1417 d10v_dot_word (nbytes)
1418 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
1421 bfd_reloc_code_real_type reloc;
1425 if (is_it_end_of_statement ())
1427 demand_empty_rest_of_line ();
1434 if (!strncasecmp (input_line_pointer, "@word", 5))
1436 exp.X_add_number = 0;
1437 input_line_pointer += 5;
1440 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1441 &exp, 0, BFD_RELOC_D10V_18);
1444 emit_expr (&exp, 2);
1446 while (*input_line_pointer++ == ',');
1448 input_line_pointer--; /* Put terminator back into stream. */
1449 demand_empty_rest_of_line ();
1453 /* Mitsubishi asked that we support some old syntax that apparently */
1454 /* had immediate operands starting with '#'. This is in some of their */
1455 /* sample code but is not documented (although it appears in some */
1456 /* examples in their assembler manual). For now, we'll solve this */
1457 /* compatibility problem by simply ignoring any '#' at the beginning */
1458 /* of an operand. */
1460 /* operands that begin with '#' should fall through to here */
1464 md_operand (expressionP)
1465 expressionS *expressionP;
1467 if (*input_line_pointer == '#')
1469 input_line_pointer++;
1470 expression (expressionP);