From d5bf5799d97ebe2239dbb96c92eda2583f4c7054 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Wed, 26 Nov 2003 21:24:53 +0000 Subject: [PATCH] * config/tc-z8k.c (s_segm): Fix indentation. (md_apply_fix3): Likewise. (cc_names): Add alias names for the names generated by the disassembler. (get_cc_operand): Be case insensitive. (get_operands): Improve error handling for cc operands. (check_operand): Not used, remove. (md_assemble): Remove unused variable prev_opcode. Skip whitespace until end-of-line only. Restore *op_end after call to hash_find. --- gas/ChangeLog | 13 +++++ gas/config/tc-z8k.c | 128 ++++++++++++++++++++++---------------------- 2 files changed, 78 insertions(+), 63 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index d1979e3968e..7fd7be5065b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2003-11-26 Christian Groessler + + * config/tc-z8k.c (s_segm): Fix indentation. + (md_apply_fix3): Likewise. + (cc_names): Add alias names for the names generated by the + disassembler. + (get_cc_operand): Be case insensitive. + (get_operands): Improve error handling for cc operands. + (check_operand): Not used, remove. + (md_assemble): Remove unused variable prev_opcode. Skip + whitespace until end-of-line only. Restore *op_end after call to + hash_find. + 2003-11-26 Nick Clifton * config/tc-h8300.c (get_operand): Allow er4-er7 for ldm/stm diff --git a/gas/config/tc-z8k.c b/gas/config/tc-z8k.c index bab6012d3f3..4c09c73229b 100644 --- a/gas/config/tc-z8k.c +++ b/gas/config/tc-z8k.c @@ -52,15 +52,15 @@ s_segm (segm) { if (segm) { - segmented_mode = 1; - machine = bfd_mach_z8001; - coff_flags = F_Z8001; + segmented_mode = 1; + machine = bfd_mach_z8001; + coff_flags = F_Z8001; } else { - segmented_mode = 0; - machine = bfd_mach_z8002; - coff_flags = F_Z8002; + segmented_mode = 0; + machine = bfd_mach_z8002; + coff_flags = F_Z8002; } } @@ -597,23 +597,31 @@ struct cc_names table[] = { { 0x1, "lt" }, { 0x2, "le" }, { 0x3, "ule" }, + { 0x4, "ov/pe" }, { 0x4, "ov" }, + { 0x4, "pe/ov" }, { 0x4, "pe" }, { 0x5, "mi" }, { 0x6, "eq" }, { 0x6, "z" }, + { 0x7, "c/ult" }, { 0x7, "c" }, + { 0x7, "ult/c" }, { 0x7, "ult" }, { 0x8, "t" }, { 0x9, "ge" }, { 0xa, "gt" }, { 0xb, "ugt" }, + { 0xc, "nov/po" }, { 0xc, "nov" }, + { 0xc, "po/nov" }, { 0xc, "po" }, { 0xd, "pl" }, { 0xe, "ne" }, { 0xe, "nz" }, + { 0xf, "nc/uge" }, { 0xf, "nc" }, + { 0xf, "uge/nc" }, { 0xf, "uge" }, { 0 , 0 } }; @@ -625,7 +633,7 @@ get_cc_operand (ptr, mode, dst) unsigned int dst ATTRIBUTE_UNUSED; { char *src = *ptr; - int i; + int i, l; while (*src == ' ') src++; @@ -633,20 +641,17 @@ get_cc_operand (ptr, mode, dst) mode->mode = CLASS_CC; for (i = 0; table[i].name; i++) { - int j; - - for (j = 0; table[i].name[j]; j++) - { - if (table[i].name[j] != src[j]) - goto fail; - } - the_cc = table[i].value; - *ptr = src + j; - return; - fail: - ; + l = strlen (table[i].name); + if (! strncasecmp (table[i].name, src, l)) + { + the_cc = table[i].value; + if (*(src + l) && *(src + l) != ',') + break; + *ptr = src + l; /* Valid cc found: "consume" it. */ + return; + } } - the_cc = 0x8; + the_cc = 0x8; /* Not recognizing the cc defaults to t. (Assuming no cc present.) */ } static void @@ -763,17 +768,28 @@ get_operands (opcode, op_end, operand) char *ptr = op_end; char *savptr; - ptr++; switch (opcode->noperands) { case 0: operand[0].mode = 0; operand[1].mode = 0; + while (*ptr == ' ') + ptr++; break; case 1: if (opcode->arg_info[0] == CLASS_CC) - get_cc_operand (&ptr, operand + 0, 0); + { + get_cc_operand (&ptr, operand + 0, 0); + while (*ptr == ' ') + ptr++; + if (*ptr && ! is_end_of_line[(unsigned char) *ptr]) + { + as_bad (_("invalid condition code '%s'"), ptr); + while (*ptr && ! is_end_of_line[(unsigned char) *ptr]) + ptr++; /* Consume rest of line. */ + } + } else if (opcode->arg_info[0] == CLASS_FLAGS) get_flags_operand (&ptr, operand + 0, 0); @@ -790,7 +806,20 @@ get_operands (opcode, op_end, operand) case 2: savptr = ptr; if (opcode->arg_info[0] == CLASS_CC) - get_cc_operand (&ptr, operand + 0, 0); + { + get_cc_operand (&ptr, operand + 0, 0); + while (*ptr == ' ') + ptr++; + if (*ptr != ',' && strchr (ptr + 1, ',')) + { + savptr = ptr; + while (*ptr != ',') + ptr++; + *ptr = 0; + ptr++; + as_bad (_("invalid condition code '%s'"), savptr); + } + } else if (opcode->arg_info[0] == CLASS_CTRL) { @@ -950,32 +979,6 @@ get_specific (opcode, operands) return 0; } -#if 0 /* Not used. */ -static void -check_operand (operand, width, string) - struct z8k_op *operand; - unsigned int width; - char *string; -{ - if (operand->exp.X_add_symbol == 0 - && operand->exp.X_op_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. */ - if ((operand->exp.X_add_number & ~width) != 0 && - (operand->exp.X_add_number | width) != (~0)) - { - as_warn (_("operand %s0x%x out of range"), - string, operand->exp.X_add_number); - } - } - -} -#endif - static char buffer[20]; static void @@ -1230,7 +1233,6 @@ md_assemble (str) char *op_end; struct z8k_op operand[3]; opcode_entry_type *opcode; - opcode_entry_type *prev_opcode; /* Drop leading whitespace. */ while (*str == ' ') @@ -1238,7 +1240,7 @@ md_assemble (str) /* Find the op code end. */ for (op_start = op_end = str; - *op_end != 0 && *op_end != ' '; + *op_end != 0 && *op_end != ' ' && ! is_end_of_line[(unsigned char) *op_end]; op_end++) ; @@ -1248,7 +1250,7 @@ md_assemble (str) } c = *op_end; - *op_end = 0; + *op_end = 0; /* Zero-terminate op code string for hash_find() call. */ opcode = (opcode_entry_type *) hash_find (opcode_hash_control, op_start); @@ -1258,12 +1260,13 @@ md_assemble (str) return; } + *op_end = c; /* Restore original string. */ + if (opcode->opcode == 250) { pseudo_typeS *p; char oc; char *old = input_line_pointer; - *op_end = c; /* Was really a pseudo op. */ @@ -1286,7 +1289,6 @@ md_assemble (str) new_input_line_pointer = get_operands (opcode, op_end, operand); if (new_input_line_pointer) input_line_pointer = new_input_line_pointer; - prev_opcode = opcode; /* XXX is this used ?? */ opcode = get_specific (opcode, operand); @@ -1509,13 +1511,13 @@ md_apply_fix3 (fixP, valP, segment) } else { - if (val & 1) - as_bad (_("cannot branch to odd address")); - val /= 2; + if (val & 1) + as_bad (_("cannot branch to odd address")); + val /= 2; if (val > 0 || val < -127) - as_bad (_("relative jump out of range")); + as_bad (_("relative jump out of range")); *buf = (*buf & 0x80) | (-val & 0x7f); - fixP->fx_no_overflow = 1; + fixP->fx_no_overflow = 1; fixP->fx_done = 1; } break; @@ -1531,11 +1533,11 @@ md_apply_fix3 (fixP, valP, segment) if (val & 1) as_bad (_("cannot branch to odd address")); if (val > 4096 || val < -4095) - as_bad (_("relative call out of range")); + as_bad (_("relative call out of range")); val = -val / 2; - *buf = (*buf & 0xf0) | ((val >> 8) & 0xf); - buf++; - *buf++ = val & 0xff; + *buf = (*buf & 0xf0) | ((val >> 8) & 0xf); + buf++; + *buf++ = val & 0xff; fixP->fx_no_overflow = 1; fixP->fx_done = 1; } -- 2.30.2