Replace --error-explicit-parallel-conflicts with --ignore-parallel-conflitcs.

Add test of parallel constraint checking.
This commit is contained in:
Nick Clifton
2003-12-17 09:41:07 +00:00
parent b639a77072
commit b145f546d4
6 changed files with 95 additions and 63 deletions

View File

@ -1,3 +1,17 @@
2003-12-17 Nick Clifton <nickc@redhat.com>
* config/tc-m32r.c (error_explicit_parallel_conflicts): Rename
to 'ignore_parallel_conflicts'.
(md_longopts): Change option names as well.
(md_parse_option): Separate the warn_explicit and ignore
parallel conflicts options.
(md_show_usage): Update descriptions of these options.
(first_writes_to_seconds_operands): Do not run this check if
ignoring parallel conflicts.
(assemble_two_insns): Remove code that checked
error_explicit_parallel_conflicts.
* doc/c-m32r.texi: Update descriptions of the options.
2003-12-16 Dmitry Semyonov <Dmitry.Semyonov@oktet.ru> 2003-12-16 Dmitry Semyonov <Dmitry.Semyonov@oktet.ru>
* tc-arm.c (do_adr): Do not adjust pc by -8 if TE_WINCE is * tc-arm.c (do_adr): Do not adjust pc by -8 if TE_WINCE is

View File

@ -116,9 +116,12 @@ static int enable_special_float = 0;
instruction might have constraint violations. */ instruction might have constraint violations. */
static int warn_explicit_parallel_conflicts = 1; static int warn_explicit_parallel_conflicts = 1;
/* Non-zero if the programmer should receive an error message when an /* Non-zero if the programmer should not receive any messages about
explicit parallel instruction might have constraint violations. */ parallel instruction with potential or real constraint violations.
static int error_explicit_parallel_conflicts = 1; The ability to suppress these messages is intended only for hardware
vendors testing the chip. It superceedes
warn_explicit_parallel_conflicts. */
static int ignore_parallel_conflicts = 0;
/* Non-zero if insns can be made parallel. */ /* Non-zero if insns can be made parallel. */
static int use_parallel = 1; static int use_parallel = 1;
@ -197,22 +200,22 @@ const char *md_shortopts = M32R_SHORTOPTS;
struct option md_longopts[] = struct option md_longopts[] =
{ {
#define OPTION_M32R (OPTION_MD_BASE) #define OPTION_M32R (OPTION_MD_BASE)
#define OPTION_M32RX (OPTION_M32R + 1) #define OPTION_M32RX (OPTION_M32R + 1)
#define OPTION_M32R2 (OPTION_M32RX + 1) #define OPTION_M32R2 (OPTION_M32RX + 1)
#define OPTION_BIG (OPTION_M32R2 + 1) #define OPTION_BIG (OPTION_M32R2 + 1)
#define OPTION_LITTLE (OPTION_BIG + 1) #define OPTION_LITTLE (OPTION_BIG + 1)
#define OPTION_PARALLEL (OPTION_LITTLE + 1) #define OPTION_PARALLEL (OPTION_LITTLE + 1)
#define OPTION_NO_PARALLEL (OPTION_PARALLEL + 1) #define OPTION_NO_PARALLEL (OPTION_PARALLEL + 1)
#define OPTION_WARN_PARALLEL (OPTION_NO_PARALLEL + 1) #define OPTION_WARN_PARALLEL (OPTION_NO_PARALLEL + 1)
#define OPTION_NO_WARN_PARALLEL (OPTION_WARN_PARALLEL + 1) #define OPTION_NO_WARN_PARALLEL (OPTION_WARN_PARALLEL + 1)
#define OPTION_ERROR_PARALLEL (OPTION_NO_WARN_PARALLEL + 1) #define OPTION_IGNORE_PARALLEL (OPTION_NO_WARN_PARALLEL + 1)
#define OPTION_NO_ERROR_PARALLEL (OPTION_ERROR_PARALLEL + 1) #define OPTION_NO_IGNORE_PARALLEL (OPTION_IGNORE_PARALLEL + 1)
#define OPTION_SPECIAL (OPTION_NO_ERROR_PARALLEL + 1) #define OPTION_SPECIAL (OPTION_NO_IGNORE_PARALLEL + 1)
#define OPTION_SPECIAL_M32R (OPTION_SPECIAL + 1) #define OPTION_SPECIAL_M32R (OPTION_SPECIAL + 1)
#define OPTION_SPECIAL_FLOAT (OPTION_SPECIAL_M32R + 1) #define OPTION_SPECIAL_FLOAT (OPTION_SPECIAL_M32R + 1)
#define OPTION_WARN_UNMATCHED (OPTION_SPECIAL_FLOAT + 1) #define OPTION_WARN_UNMATCHED (OPTION_SPECIAL_FLOAT + 1)
#define OPTION_NO_WARN_UNMATCHED (OPTION_WARN_UNMATCHED + 1) #define OPTION_NO_WARN_UNMATCHED (OPTION_WARN_UNMATCHED + 1)
{"m32r", no_argument, NULL, OPTION_M32R}, {"m32r", no_argument, NULL, OPTION_M32R},
{"m32rx", no_argument, NULL, OPTION_M32RX}, {"m32rx", no_argument, NULL, OPTION_M32RX},
{"m32r2", no_argument, NULL, OPTION_M32R2}, {"m32r2", no_argument, NULL, OPTION_M32R2},
@ -226,10 +229,10 @@ struct option md_longopts[] =
{"Wp", no_argument, NULL, OPTION_WARN_PARALLEL}, {"Wp", no_argument, NULL, OPTION_WARN_PARALLEL},
{"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL}, {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
{"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL}, {"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
{"error-explicit-parallel-conflicts", no_argument, NULL, OPTION_ERROR_PARALLEL}, {"ignore-parallel-conflicts", no_argument, NULL, OPTION_IGNORE_PARALLEL},
{"Ep", no_argument, NULL, OPTION_ERROR_PARALLEL}, {"Ip", no_argument, NULL, OPTION_IGNORE_PARALLEL},
{"no-error-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_ERROR_PARALLEL}, {"no-ignore-parallel-conflicts", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
{"Enp", no_argument, NULL, OPTION_NO_ERROR_PARALLEL}, {"nIp", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
{"hidden", no_argument, NULL, OPTION_SPECIAL}, {"hidden", no_argument, NULL, OPTION_SPECIAL},
{"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R}, {"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R},
{"float", no_argument, NULL, OPTION_SPECIAL_FLOAT}, {"float", no_argument, NULL, OPTION_SPECIAL_FLOAT},
@ -318,22 +321,18 @@ md_parse_option (c, arg)
case OPTION_WARN_PARALLEL: case OPTION_WARN_PARALLEL:
warn_explicit_parallel_conflicts = 1; warn_explicit_parallel_conflicts = 1;
error_explicit_parallel_conflicts = 0;
break; break;
case OPTION_NO_WARN_PARALLEL: case OPTION_NO_WARN_PARALLEL:
warn_explicit_parallel_conflicts = 0; warn_explicit_parallel_conflicts = 0;
error_explicit_parallel_conflicts = 0;
break; break;
case OPTION_ERROR_PARALLEL: case OPTION_IGNORE_PARALLEL:
warn_explicit_parallel_conflicts = 1; ignore_parallel_conflicts = 1;
error_explicit_parallel_conflicts = 1;
break; break;
case OPTION_NO_ERROR_PARALLEL: case OPTION_NO_IGNORE_PARALLEL:
error_explicit_parallel_conflicts = 0; ignore_parallel_conflicts = 0;
warn_explicit_parallel_conflicts = 0;
break; break;
case OPTION_SPECIAL: case OPTION_SPECIAL:
@ -406,27 +405,27 @@ md_show_usage (stream)
fprintf (stream, _("\ fprintf (stream, _("\
-warn-explicit-parallel-conflicts warn when parallel instructions\n")); -warn-explicit-parallel-conflicts warn when parallel instructions\n"));
fprintf (stream, _("\ fprintf (stream, _("\
violate contraints\n")); might violate contraints\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-no-warn-explicit-parallel-conflicts do not warn when parallel\n")); -no-warn-explicit-parallel-conflicts do not warn when parallel\n"));
fprintf (stream, _("\ fprintf (stream, _("\
instructions violate contraints\n")); instructions might violate contraints\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-Wp synonym for -warn-explicit-parallel-conflicts\n")); -Wp synonym for -warn-explicit-parallel-conflicts\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-Wnp synonym for -no-warn-explicit-parallel-conflicts\n")); -Wnp synonym for -no-warn-explicit-parallel-conflicts\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-error-explicit-parallel-conflicts error when parallel instructions\n")); -ignore-parallel-conflicts do not check parallel instructions\n"));
fprintf (stream, _("\ fprintf (stream, _("\
violate contraints\n")); fo contraint violations\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-no-error-explicit-parallel-conflicts do not error when parallel\n")); -no-ignore-parallel-conflicts check parallel instructions for\n"));
fprintf (stream, _("\ fprintf (stream, _("\
instructions violate contraints\n")); contraint violations\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-Ep synonym for -error-explicit-parallel-conflicts\n")); -Ip synonym for -ignore-parallel-conflicts\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-Enp synonym for -no-error-explicit-parallel-conflicts\n")); -nIp synonym for -no-ignore-parallel-conflicts\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n")); -warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n"));
@ -756,6 +755,9 @@ first_writes_to_seconds_operands (a, b, check_outputs)
const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn); const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn);
int a_index; int a_index;
if (ignore_parallel_conflicts)
return 0;
/* If at least one of the instructions takes no operands, then there is /* If at least one of the instructions takes no operands, then there is
nothing to check. There really are instructions without operands, nothing to check. There really are instructions without operands,
eg 'nop'. */ eg 'nop'. */
@ -870,7 +872,7 @@ can_make_parallel (a, b)
abort (); abort ();
if (first_writes_to_seconds_operands (a, b, TRUE)) if (first_writes_to_seconds_operands (a, b, TRUE))
return _("Instructions write to the same destination register."); return _("instructions write to the same destination register.");
a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE); a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE);
b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE); b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE);
@ -1154,17 +1156,13 @@ assemble_two_insns (str, str2, parallel_p)
if (parallel_p && warn_explicit_parallel_conflicts) if (parallel_p && warn_explicit_parallel_conflicts)
{ {
void (* func)(const char *, ...);
func = error_explicit_parallel_conflicts ? as_bad : as_warn;
if (first_writes_to_seconds_operands (&first, &second, FALSE)) if (first_writes_to_seconds_operands (&first, &second, FALSE))
/* xgettext:c-format */ /* xgettext:c-format */
func (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2); as_warn (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2);
if (first_writes_to_seconds_operands (&second, &first, FALSE)) if (first_writes_to_seconds_operands (&second, &first, FALSE))
/* xgettext:c-format */ /* xgettext:c-format */
func (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2); as_warn (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2);
} }
if (!parallel_p if (!parallel_p

View File

@ -119,27 +119,26 @@ questionable parallel instructions are encountered.
This is a shorter synonym for the @emph{-no-warn-explicit-parallel-conflicts} This is a shorter synonym for the @emph{-no-warn-explicit-parallel-conflicts}
option. option.
@item -error-explicit-parallel-conflicts @item -ignore-parallel-conflicts
@cindex @samp{-error-explicit-parallel-conflicts} option, M32RX @cindex @samp{-ignore-parallel-conflicts} option, M32RX
This option performs the same thing as the This option tells the assembler's to stop checking parallel
@emph{-warn-explicit-parallel-conflicts} expcept that instead of instructions for contraint violations. This ability is provided for
warning messages being produced, error messages will be produced. If hardware vendors testing chip designs and should not be used under
any error messages are generated then GAS will not produce an output normal circumstances.
file.
@item -no-error-explicit-parallel-conflicts @item -no-ignore-parallel-conflicts
@cindex @samp{-no-error-explicit-parallel-conflicts} option, M32RX @cindex @samp{-no-ignore-parallel-conflicts} option, M32RX
This option disables a previously enabled This option restores the assembler's default behaviour of checking
@emph{-error-explicit-parallel-conflicts} option. parallel instructions to detect constraint violations.
@item -Ep @item -Ip
@cindex @samp{-Ep} option, M32RX @cindex @samp{-Ip} option, M32RX
This is a shorter synonym for the @emph{-error-explicit-parallel-conflicts} This is a shorter synonym for the @emph{-ignore-parallel-conflicts}
option. option.
@item -Enp @item -nIp
@cindex @samp{-Enp} option, M32RX @cindex @samp{-nIp} option, M32RX
This is a shorter synonym for the @emph{-no-error-explicit-parallel-conflicts} This is a shorter synonym for the @emph{-no-ignore-parallel-conflicts}
option. option.
@item -warn-unmatched-high @item -warn-unmatched-high

View File

@ -1,3 +1,9 @@
2003-12-17 Nick Clifton <nickc@redhat.com>
* gas/m32r/error.exp: Add parallel.s
* gas/m32r/parallel.s: New file: Test warning and error
messages produced for parallel conflicts.
2003-12-16 Nick Clifton <nickc@redhat.com> 2003-12-16 Nick Clifton <nickc@redhat.com>
* gas/arm/arm.exp: Run special versions of the inst, ldconst, * gas/arm/arm.exp: Run special versions of the inst, ldconst,

View File

@ -9,6 +9,7 @@ if [istarget m32r-*-*] {
dg-runtest "$srcdir/$subdir/wrongsize.s" "" "" dg-runtest "$srcdir/$subdir/wrongsize.s" "" ""
dg-runtest "$srcdir/$subdir/interfere.s" "" "" dg-runtest "$srcdir/$subdir/interfere.s" "" ""
dg-runtest "$srcdir/$subdir/outofrange.s" "" "" dg-runtest "$srcdir/$subdir/outofrange.s" "" ""
dg-runtest "$srcdir/$subdir/parallel.s" "" ""
dg-finish dg-finish

View File

@ -0,0 +1,14 @@
; Test error messages where parallel instructions conflict
; { dg-options "-m32rx" }
; { dg-do assemble { target m32r-*-* } }
.text
.global parallel
parallel:
mv r1,r0 || mv r2,r1
; { dg-warning "output of 1st instruction" "parallel output overlaps input" { target *-*-* } { 9 } }
mv r1,r0 || mv r0,r2
; { dg-warning "output of 2nd instruction" "parallel output overlaps input" { target *-*-* } { 11 } }
mv r1,r0 || mv r1,r2
; { dg-error "instructions write to the same destination register" "parallel overlapping destinations" { target *-*-* } { 13 } }