final.c (final_scan_insn): Handle all comparison codes in non-jump and cmove insn.
* gcc/final.c (final_scan_insn) [HAVE_cc0]: Handle all comparison codes in non-jump and cmove insn. * gcc/testsuite/gcc.dg/torture/fp-compare.c: New testcase. From-SVN: r193187
This commit is contained in:
parent
e77c9aedcd
commit
511d31d856
4 changed files with 45 additions and 30 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-11-05 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* final.c (final_scan_insn) [HAVE_cc0]: Handle all comparison
|
||||
codes in non-jump and cmove insn.
|
||||
|
||||
2012-11-05 Uros Bizjak <ubizjak@gmail.com>
|
||||
Vladimir Yakovlev <vladimir.b.yakovlev@intel.com>
|
||||
|
||||
|
|
43
gcc/final.c
43
gcc/final.c
|
@ -1,7 +1,7 @@
|
|||
/* Convert RTL to assembler code and output it, for GNU compiler.
|
||||
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
|
||||
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||
2010, 2011
|
||||
2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -2689,36 +2689,19 @@ final_scan_insn (rtx insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
|
|||
else_rtx = const0_rtx;
|
||||
}
|
||||
|
||||
switch (GET_CODE (cond_rtx))
|
||||
if (COMPARISON_P (cond_rtx)
|
||||
&& XEXP (cond_rtx, 0) == cc0_rtx)
|
||||
{
|
||||
case GTU:
|
||||
case GT:
|
||||
case LTU:
|
||||
case LT:
|
||||
case GEU:
|
||||
case GE:
|
||||
case LEU:
|
||||
case LE:
|
||||
case EQ:
|
||||
case NE:
|
||||
{
|
||||
int result;
|
||||
if (XEXP (cond_rtx, 0) != cc0_rtx)
|
||||
break;
|
||||
result = alter_cond (cond_rtx);
|
||||
if (result == 1)
|
||||
validate_change (insn, &SET_SRC (set), then_rtx, 0);
|
||||
else if (result == -1)
|
||||
validate_change (insn, &SET_SRC (set), else_rtx, 0);
|
||||
else if (result == 2)
|
||||
INSN_CODE (insn) = -1;
|
||||
if (SET_DEST (set) == SET_SRC (set))
|
||||
delete_insn (insn);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
int result;
|
||||
result = alter_cond (cond_rtx);
|
||||
if (result == 1)
|
||||
validate_change (insn, &SET_SRC (set), then_rtx, 0);
|
||||
else if (result == -1)
|
||||
validate_change (insn, &SET_SRC (set), else_rtx, 0);
|
||||
else if (result == 2)
|
||||
INSN_CODE (insn) = -1;
|
||||
if (SET_DEST (set) == SET_SRC (set))
|
||||
delete_insn (insn);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2012-11-05 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* gcc.dg/torture/fp-compare.c: New testcase.
|
||||
|
||||
2012-11-05 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.dg/const-1.c: Update.
|
||||
|
|
23
gcc/testsuite/gcc.dg/torture/fp-compare.c
Normal file
23
gcc/testsuite/gcc.dg/torture/fp-compare.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
/* { dg-do run } */
|
||||
/* Check that find_scan_insn properly handles swapped FP comparisons. */
|
||||
static double x;
|
||||
static int exit_code;
|
||||
|
||||
void __attribute__ ((noinline))
|
||||
check_int (int a, int b)
|
||||
{
|
||||
exit_code += (a != b);
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
x = 0.0;
|
||||
asm ("" : "+m" (x));
|
||||
check_int (__builtin_isgreater (x, 1.0), 0);
|
||||
check_int (__builtin_isgreaterequal (x, 1.0), 0);
|
||||
check_int (__builtin_isless (x, 1.0), 1);
|
||||
check_int (__builtin_islessequal (x, 1.0), 1);
|
||||
check_int (__builtin_islessgreater (x, 1.0), 1);
|
||||
return exit_code;
|
||||
}
|
Loading…
Add table
Reference in a new issue