diff options
Diffstat (limited to 'gnu/usr.bin/as/config/tc-h8300.c')
-rw-r--r-- | gnu/usr.bin/as/config/tc-h8300.c | 430 |
1 files changed, 215 insertions, 215 deletions
diff --git a/gnu/usr.bin/as/config/tc-h8300.c b/gnu/usr.bin/as/config/tc-h8300.c index db4786bbfac2..2ce2f2bd1935 100644 --- a/gnu/usr.bin/as/config/tc-h8300.c +++ b/gnu/usr.bin/as/config/tc-h8300.c @@ -1,24 +1,24 @@ /* tc-h8300.c -- Assemble code for the Hitachi H8/300 Copyright (C) 1991, 1992 Free Software Foundation. - + This file is part of GAS, the GNU Assembler. - + GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + GAS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* +/* Written By Steve Chamberlain sac@cygnus.com */ @@ -84,7 +84,7 @@ struct reg_entry char number; }; -struct reg_entry reg_list[] = { +struct reg_entry reg_list[] = { "r0",WORD_REG +0, "r1",WORD_REG +1, "r2",WORD_REG +2, @@ -120,17 +120,17 @@ struct reg_entry reg_list[] = { #endif -void md_begin () +void md_begin () { struct h8_opcode *opcode; const struct reg_entry *reg; char prev_buffer[100]; int idx = 0; - + opcode_hash_control = hash_new(); prev_buffer[0] = 0; - - for (opcode = h8_opcodes; opcode->name; opcode++) + + for (opcode = h8_opcodes; opcode->name; opcode++) { /* Strip off any . part when inserting the opcode and only enter unique codes into the hash table @@ -139,7 +139,7 @@ void md_begin () unsigned int len = strlen(src); char *dst = malloc(len+1); char *buffer = dst; - opcode->size = 0; + opcode->size = 0; while (*src) { if (*src == '.') { *dst++ = 0; @@ -149,15 +149,15 @@ void md_begin () } *dst++ = *src++; } - if (strcmp(buffer, prev_buffer)) + if (strcmp(buffer, prev_buffer)) { hash_insert(opcode_hash_control, buffer, (char *)opcode); strcpy(prev_buffer, buffer); idx++; } opcode->idx = idx; - - + + /* Find the number of operands */ opcode->noperands = 0; while (opcode->args.nib[opcode->noperands] != E) @@ -167,7 +167,7 @@ void md_begin () while (opcode->data.nib[opcode->length*2] != E) opcode->length++; } - + } @@ -176,7 +176,7 @@ struct h8_exp { char *e_end; expressionS e_exp; }; -struct h8_op +struct h8_op { unsigned int dispreg; op_type mode; @@ -187,14 +187,14 @@ struct h8_op /* - parse operands + parse operands WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp r0l,r0h,..r7l,r7h @WREG @WREG+ @-WREG #const - + */ op_type r8_sord[] = {RS8, RD8}; @@ -204,42 +204,42 @@ op_type abs_sord[2] = {ABS16SRC, ABS16DST}; op_type disp_sord[] = {DISPSRC, DISPDST}; /* try and parse a reg name, returns number of chars consumed */ -int +int DEFUN(parse_reg,(src, mode, reg, dst), char *src AND op_type *mode AND unsigned int *reg AND int dst) { - if (src[0] == 's' && src[1] == 'p') + if (src[0] == 's' && src[1] == 'p') { *mode = r16_sord[dst]; *reg = 7; return 2; } - if (src[0] == 'c' && src[1] == 'c' && src[2] == 'r') + if (src[0] == 'c' && src[1] == 'c' && src[2] == 'r') { *mode = CCR; *reg = 0; return 3; } - if (src[0] == 'f' && src[1] == 'p') + if (src[0] == 'f' && src[1] == 'p') { *mode = r16_sord[dst]; *reg = 6; return 2; } - if (src[0] == 'r') + if (src[0] == 'r') { - if (src[1] >= '0' && src[1] <= '7') + if (src[1] >= '0' && src[1] <= '7') { - if (src[2] == 'l') + if (src[2] == 'l') { *mode = r8_sord[dst]; *reg = (src[1] - '0') + 8; return 3; } - if (src[2] == 'h') + if (src[2] == 'h') { *mode = r8_sord[dst]; *reg = (src[1] - '0') ; @@ -265,7 +265,7 @@ char * seg = expr(0,op); new = input_line_pointer; input_line_pointer = save; - if (SEG_NORMAL(seg)) + if (SEG_NORMAL(seg)) return new; switch (seg) { case SEG_ABSOLUTE: @@ -291,13 +291,13 @@ static char * ptr++; while (isdigit(*ptr)) ptr++; - + } return ptr; } /* The many forms of operand: - + Rn Register direct @Rn Register indirect @(exp[:16], Rn) Register indirect with displacement @@ -306,17 +306,17 @@ static char * @aa:8 absolute 8 bit @aa:16 absolute 16 bit @aa absolute 16 bit - + #xx[:size] immediate data @(exp:[8], pc) pc rel @@aa[:8] memory indirect - + */ -static void +static void DEFUN(get_operand,(ptr, op, dst), - char **ptr AND - struct h8_op *op AND + char **ptr AND + struct h8_op *op AND unsigned int dst) { char *src = *ptr; @@ -325,48 +325,48 @@ static void unsigned int len; unsigned int size; op->mode = E; - + len = parse_reg(src, &op->mode, &op->reg, dst); if (len) { *ptr = src + len; return ; } - - if (*src == '@') + + if (*src == '@') { src++; - if (*src == '@') + if (*src == '@') { src++; src = parse_exp(src,&op->exp); src = skip_colonthing(src); - + *ptr = src; - + op->mode = MEMIND; return; - + } - - - if (*src == '-') - { + + + if (*src == '-') + { src++; len = parse_reg(src, &mode, &num, dst); - if (len == 0) + if (len == 0) { /* Oops, not a reg after all, must be ordinary exp */ src--; /* must be a symbol */ op->mode = abs_sord[dst]; *ptr = skip_colonthing(parse_exp(src, &op->exp)); - + return; - - + + } - - if (mode != r16_sord[dst]) + + if (mode != r16_sord[dst]) { as_bad("@- needs word register"); } @@ -375,13 +375,13 @@ static void *ptr = src + len; return; } - if (*src == '(' && ')') + if (*src == '(' && ')') { /* Disp */ src++; src = parse_exp(src, &op->exp); - - if (*src == ')') + + if (*src == ')') { src++; op->mode = abs_sord[dst]; @@ -389,8 +389,8 @@ static void return; } src = skip_colonthing(src); - - if (*src != ',') + + if (*src != ',') { as_bad("expected @(exp, reg16)"); } @@ -403,24 +403,24 @@ static void op->mode = disp_sord[dst]; src += len; src = skip_colonthing(src); - - if (*src != ')' && '(') + + if (*src != ')' && '(') { as_bad("expected @(exp, reg16)"); - + } *ptr = src +1; - + return; } len = parse_reg(src, &mode, &num, dst); - + if (len) { src += len; - if (*src == '+') + if (*src == '+') { src++; - if (mode != RS16) + if (mode != RS16) { as_bad("@Rn+ needs src word register"); } @@ -429,7 +429,7 @@ static void *ptr = src; return; } - if (mode != r16_sord[dst]) + if (mode != r16_sord[dst]) { as_bad("@Rn needs word register"); } @@ -438,23 +438,23 @@ static void *ptr = src; return; } - else + else { /* must be a symbol */ op->mode = abs_sord[dst]; *ptr = skip_colonthing(parse_exp(src, &op->exp)); - + return; } } - - + + if (*src == '#') { src++; op->mode = IMM16; src = parse_exp(src, &op->exp); *ptr= skip_colonthing(src); - + return; } else { @@ -469,35 +469,35 @@ static DEFUN(get_operands,(noperands,op_end, operand), unsigned int noperands AND char *op_end AND - struct h8_op *operand) + struct h8_op *operand) { char *ptr = op_end; - switch (noperands) + switch (noperands) { case 0: operand[0].mode = 0; operand[1].mode = 0; break; - - case 1: + + case 1: ptr++; get_operand(& ptr, operand +0,0); operand[1].mode =0; break; - + case 2: ptr++; get_operand(& ptr, operand +0,0); if (*ptr == ',') ptr++; get_operand(& ptr, operand +1, 1); break; - + default: - abort(); + abort(); } - - - return ptr; + + + return ptr; } /* Passed a pointer to a list of opcodes which use different @@ -514,18 +514,18 @@ static struct h8_opcode *this_try = opcode ; int found = 0; unsigned int noperands = opcode->noperands; - + unsigned int dispreg; unsigned int this_index = opcode->idx; - while (this_index == opcode->idx && !found) + while (this_index == opcode->idx && !found) { unsigned int i; - + this_try = opcode ++; - for (i = 0; i < noperands; i++) + for (i = 0; i < noperands; i++) { op_type op = (this_try->args.nib[i]) & ~(B30|B31); - switch (op) + switch (op) { case Hex0: case Hex1: @@ -546,7 +546,7 @@ static break; case DISPSRC: case DISPDST: - operands[0].dispreg = operands[i].reg; + operands[0].dispreg = operands[i].reg; case RD8: case RS8: case RDIND: @@ -571,7 +571,7 @@ static case ABS8SRC: case ABS16OR8SRC: case ABS16ORREL8SRC: - + if (operands[i].mode != ABS16SRC) goto fail; break; case ABS16OR8DST: @@ -584,9 +584,9 @@ static found =1; fail: ; } - if (found) + if (found) return this_try; - else + else return 0; } @@ -596,10 +596,10 @@ static void unsigned int width AND char *string) { - if (operand->exp.X_add_symbol == 0 + if (operand->exp.X_add_symbol == 0 && operand->exp.X_subtract_symbol == 0) { - + /* No symbol involved, let's look at offset, it's dangerous if any of the high bits are not 0 or ff's, find out by oring or anding with the width and seeing if the answer is 0 or all fs*/ @@ -609,19 +609,19 @@ static void as_warn("operand %s0x%x out of range.", string, operand->exp.X_add_number); } } - + } /* Now we know what sort of opcodes it is, lets build the bytes - */ -static void +static void DEFUN (build_bytes,(this_try, operand), struct h8_opcode *this_try AND struct h8_op *operand) { unsigned int i; - + char *output = frag_more(this_try->length); char *output_ptr = output; op_type *nibble_ptr = this_try->data.nib; @@ -630,18 +630,18 @@ static void char high; int nib; top: ; - while (*nibble_ptr != E) + while (*nibble_ptr != E) { int nibble; - for (nibble = 0; nibble <2; nibble++) + for (nibble = 0; nibble <2; nibble++) { c = *nibble_ptr & ~(B30|B31); - switch (c) + switch (c) { default: abort(); case KBIT: - switch (operand[0].exp.X_add_number) + switch (operand[0].exp.X_add_number) { case 1: nib = 0; @@ -659,7 +659,7 @@ static void case 0: case 1: case 2: case 3: case 4: case 5: case 6: - case 7: case 8: case 9: case 10: case 11: + case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: nib = c; break; @@ -670,23 +670,23 @@ static void operand[0].mode = IMM8; nib = 0; break; - + case DISPDST: nib = 0; break; - case IMM3: + case IMM3: if (operand[0].exp.X_add_symbol == 0) { operand[0].mode = 0; /* stop it making a fix */ nib = (operand[0].exp.X_add_number); } else as_bad("can't have symbol for bit number"); - if (nib < 0 || nib > 7) + if (nib < 0 || nib > 7) { as_bad("Bit number out of range %d", nib); } - + break; - + case ABS16DST: nib = 0; break; @@ -700,35 +700,35 @@ static void break; case ABS16OR8DST: operand[1].mode = c; - + nib = 0; - + break; - + case ABS16ORREL8SRC: operand[0].mode = c; nib=0; break; - + case ABS16OR8SRC: operand[0].mode = ABS16OR8SRC; nib = 0; break; - case DISPSRC: + case DISPSRC: operand[0].mode = ABS16SRC; nib = 0; break; - + case DISP8: operand[0].mode = DISP8; nib = 0; break; - + case ABS16SRC: case IMM16: case IGNORE: case MEMIND: - + nib=0; break; case RS8: @@ -737,22 +737,22 @@ static void case RSINC: nib = operand[0].reg; break; - + case RD8: case RD16: case RDDEC: case RDIND: nib = operand[1].reg; break; - - case E: + + case E: abort(); break; } if (*nibble_ptr & B31) { nib |=0x8; } - + if (nibble == 0) { *output_ptr = nib << 4; } @@ -762,21 +762,21 @@ static void } nibble_ptr++; } - + } - + /* output any fixes */ - for (i = 0; i < 2; i++) + for (i = 0; i < 2; i++) { switch (operand[i].mode) { case 0: break; - + case DISP8: check_operand(operand+i, 0x7f,"@"); - + fix_new(frag_now, - output - frag_now->fr_literal + 1, + output - frag_now->fr_literal + 1, 1, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -788,14 +788,14 @@ static void check_operand(operand+i, 0xff,"#"); /* If there is nothing else going on we can safely reloc in place */ - if (operand[i].exp.X_add_symbol == 0) + if (operand[i].exp.X_add_symbol == 0) { output[1] = operand[i].exp.X_add_number; } - else + else { fix_new(frag_now, - output - frag_now->fr_literal + 1, + output - frag_now->fr_literal + 1, 1, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -803,12 +803,12 @@ static void 0, R_RELBYTE); } - + break; case MEMIND: check_operand(operand+i, 0xff,"@@"); fix_new(frag_now, - output - frag_now->fr_literal + 1, + output - frag_now->fr_literal + 1, 1, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -820,7 +820,7 @@ static void case ABS8SRC: check_operand(operand+i, 0xff,"@"); fix_new(frag_now, - output - frag_now->fr_literal + 1, + output - frag_now->fr_literal + 1, 1, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -828,13 +828,13 @@ static void 0, R_RELBYTE); break; - - case ABS16OR8SRC: + + case ABS16OR8SRC: case ABS16OR8DST: check_operand(operand+i, 0xffff,"@"); - + fix_new(frag_now, - output - frag_now->fr_literal + 2, + output - frag_now->fr_literal + 2, 2, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -842,12 +842,12 @@ static void 0, R_MOVB1); break; - - case ABS16ORREL8SRC: + + case ABS16ORREL8SRC: check_operand(operand+i, 0xffff,"@"); - + fix_new(frag_now, - output - frag_now->fr_literal + 2, + output - frag_now->fr_literal + 2, 2, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -855,26 +855,26 @@ static void 0, R_JMP1); break; - - + + case ABS16SRC: case ABS16DST: case IMM16: case DISPSRC: case DISPDST: check_operand(operand+i, 0xffff,"@"); - if (operand[i].exp.X_add_symbol == 0) + if (operand[i].exp.X_add_symbol == 0) { /* This should be done with bfd */ - output[3] = operand[i].exp.X_add_number & 0xff; + output[3] = operand[i].exp.X_add_number & 0xff; output[2] = operand[i].exp.X_add_number >> 8; - + } - else + else { - + fix_new(frag_now, - output - frag_now->fr_literal + 2, + output - frag_now->fr_literal + 2, 2, operand[i].exp.X_add_symbol, operand[i].exp.X_subtract_symbol, @@ -882,25 +882,25 @@ static void 0, R_RELWORD); } - + break; case RS8: case RD8: case RS16: case RD16: - case RDDEC: + case RDDEC: case KBIT: case RSINC: case RDIND: case RSIND: case CCR: - + break; default: abort(); } } - + } /* try and give an intelligent error message for common and simple to @@ -913,48 +913,48 @@ static void struct h8_op *operand) { struct h8_opcode *scan = opcode; - - /* Find out if there was more than one possible opccode */ - - if ((opcode+1)->idx != opcode->idx) + + /* Find out if there was more than one possible opccode */ + + if ((opcode+1)->idx != opcode->idx) { unsigned int argn; - + /* Only one opcode of this flavour, try and guess which operand didn't match */ - for (argn = 0; argn < opcode->noperands; argn++) + for (argn = 0; argn < opcode->noperands; argn++) { - switch (opcode->args.nib[argn]) + switch (opcode->args.nib[argn]) { case RD16: - if (operand[argn].mode != RD16) + if (operand[argn].mode != RD16) { - as_bad("destination operand must be 16 bit register"); + as_bad("destination operand must be 16 bit register"); } return; case RS8: - - if (operand[argn].mode != RS8) + + if (operand[argn].mode != RS8) { as_bad("source operand must be 8 bit register"); } return; case ABS16DST: - if (operand[argn].mode != ABS16DST) + if (operand[argn].mode != ABS16DST) { as_bad("destination operand must be 16bit absolute address"); return; } - + case RD8: - if (operand[argn].mode != RD8) + if (operand[argn].mode != RD8) { - as_bad("destination operand must be 8 bit register"); + as_bad("destination operand must be 8 bit register"); } return; - + case ABS16SRC: - if (operand[argn].mode != ABS16SRC) + if (operand[argn].mode != ABS16SRC) { as_bad("source operand must be 16bit absolute address"); return; @@ -972,27 +972,27 @@ static void -void +void DEFUN(md_assemble,(str), char *str) { char *op_start; char *op_end; unsigned int i; - struct h8_op operand[2]; + struct h8_op operand[2]; struct h8_opcode * opcode; struct h8_opcode * prev_opcode; - + char *dot = 0; - char c; + char c; /* Drop leading whitespace */ while (*str == ' ') str++; - + /* find the op code end */ for (op_start = op_end = str; *op_end != 0 && *op_end != ' '; - op_end ++) + op_end ++) { if (*op_end == '.') { dot = op_end+1; @@ -1001,57 +1001,57 @@ void break; } } - + ; - - if (op_end == op_start) + + if (op_end == op_start) { as_bad("can't find opcode "); } c = *op_end; - + *op_end = 0; - + opcode = (struct h8_opcode *) hash_find(opcode_hash_control, op_start); - - if (opcode == NULL) + + if (opcode == NULL) { as_bad("unknown opcode"); return; } - - + + input_line_pointer = get_operands(opcode->noperands, op_end, operand); *op_end = c; prev_opcode = opcode; - + opcode = get_specific(opcode, operand); - - if (opcode == 0) + + if (opcode == 0) { /* Couldn't find an opcode which matched the operands */ char *where =frag_more(2); where[0] = 0x0; where[1] = 0x0; clever_message(prev_opcode, operand); - + return; } - if (opcode->size && dot) + if (opcode->size && dot) { - if (opcode->size != *dot) + if (opcode->size != *dot) { as_warn("mismatch between opcode size and operand size"); } } - + build_bytes(opcode, operand); - + } -void +void DEFUN(tc_crawl_symbol_chain, (headers), object_headers *headers) { @@ -1064,14 +1064,14 @@ symbolS *DEFUN(md_undefined_symbol,(name), return 0; } -void +void DEFUN(tc_headers_hook,(headers), object_headers *headers) { - printf("call to tc_headers_hook \n"); + printf("call to tc_headers_hook \n"); } void - DEFUN_VOID(md_end) + DEFUN_VOID(md_end) { } @@ -1094,7 +1094,7 @@ int *sizeP; LITTLENUM_TYPE *wordP; char *t; char *atof_ieee(); - + switch (type) { case 'f': case 'F': @@ -1102,24 +1102,24 @@ int *sizeP; case 'S': prec = 2; break; - + case 'd': case 'D': case 'r': case 'R': prec = 4; break; - + case 'x': case 'X': prec = 6; break; - + case 'p': case 'P': prec = 6; break; - + default: *sizeP=0; return "Bad call to MD_ATOF()"; @@ -1127,7 +1127,7 @@ int *sizeP; t=atof_ieee(input_line_pointer,type,words); if (t) input_line_pointer=t; - + *sizeP=prec * sizeof(LITTLENUM_TYPE); for (wordP=words;prec--;) { md_number_to_chars(litP,(long)(*wordP++),sizeof(LITTLENUM_TYPE)); @@ -1144,7 +1144,7 @@ char ***vecP; { return 0; - + } int md_short_jump_size; @@ -1184,7 +1184,7 @@ long long size) { return((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg])); - + } void @@ -1193,7 +1193,7 @@ fixS *fixP; long val; { char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; - + switch (fixP->fx_size) { case 1: *buf++=val; @@ -1210,11 +1210,11 @@ long val; break; default: abort(); - + } } -void DEFUN(md_operand, (expressionP),expressionS *expressionP) +void DEFUN(md_operand, (expressionP),expressionS *expressionP) { } int md_long_jump_size; @@ -1222,7 +1222,7 @@ int md_estimate_size_before_relax(fragP, segment_type) register fragS *fragP; register segT segment_type; -{ +{ printf("call tomd_estimate_size_before_relax \n"); abort(); } /* Put number into target byte order */ @@ -1241,7 +1241,7 @@ void DEFUN(md_number_to_chars,(ptr, use, nbytes), abort(); } } -long md_pcrel_from(fixP) +long md_pcrel_from(fixP) fixS *fixP; { abort(); } void tc_coff_symbol_emit_hook() { } @@ -1254,17 +1254,17 @@ bfd_vma base; { symbolS *symbol_ptr; - + symbol_ptr = fix_ptr->fx_addsy; - + /* If this relocation is attached to a symbol then it's ok to output it */ if (fix_ptr->fx_r_type == RELOC_32) { /* cons likes to create reloc32's whatever the size of the reloc.. */ - switch (fix_ptr->fx_size) + switch (fix_ptr->fx_size) { - + case 2: intr->r_type = R_RELWORD; break; @@ -1273,23 +1273,23 @@ bfd_vma base; break; default: abort(); - + } - + } - else { + else { intr->r_type = fix_ptr->fx_r_type; } - + intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where +base; intr->r_offset = fix_ptr->fx_offset; - + if (symbol_ptr) intr->r_symndx = symbol_ptr->sy_number; else intr->r_symndx = -1; - - + + } /* end of tc-h8300.c */ |