This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
patch: e500 fix unsafe fp comparisons
- From: Aldy Hernandez <aldyh at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 14 Jan 2005 11:56:11 -0400
- Subject: patch: e500 fix unsafe fp comparisons
The check here should match the check in spe.md. It should have been
flag_unsafe_math_optimizations all along, not that anyone every uses tha
on e500.
Tested on powerpc-eabispe.
Committed to mainline and 3.4-e500-branch.
Cheers.
* config/rs6000/rs6000.c (rs6000_generate_compare): Replace
flag_finite_math_only with flag_unsafe_math_optimizations.
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.775
diff -c -p -r1.775 rs6000.c
*** config/rs6000/rs6000.c 11 Jan 2005 20:45:59 -0000 1.775
--- config/rs6000/rs6000.c 14 Jan 2005 15:50:49 -0000
*************** rs6000_generate_compare (enum rtx_code c
*** 11302,11314 ****
{
case EQ: case UNEQ: case NE: case LTGT:
if (op_mode == SFmode)
! cmp = flag_finite_math_only
? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_finite_math_only
? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
--- 11302,11314 ----
{
case EQ: case UNEQ: case NE: case LTGT:
if (op_mode == SFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
*************** rs6000_generate_compare (enum rtx_code c
*** 11317,11329 ****
break;
case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
if (op_mode == SFmode)
! cmp = flag_finite_math_only
? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_finite_math_only
? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
--- 11317,11329 ----
break;
case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
if (op_mode == SFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
*************** rs6000_generate_compare (enum rtx_code c
*** 11332,11344 ****
break;
case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
if (op_mode == SFmode)
! cmp = flag_finite_math_only
? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_finite_math_only
? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
--- 11332,11344 ----
break;
case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
if (op_mode == SFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
*************** rs6000_generate_compare (enum rtx_code c
*** 11370,11382 ****
/* Do the EQ. */
if (op_mode == SFmode)
! cmp = flag_finite_math_only
? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_finite_math_only
? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
--- 11370,11382 ----
/* Do the EQ. */
if (op_mode == SFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1);
else if (op_mode == DFmode)
! cmp = flag_unsafe_math_optimizations
? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
rs6000_compare_op1)
: gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
*************** rs6000_generate_compare (enum rtx_code c
*** 11412,11420 ****
rs6000_compare_op1)));
/* Some kinds of FP comparisons need an OR operation;
! under flag_finite_math_only we don't bother. */
if (rs6000_compare_fp_p
! && ! flag_finite_math_only
&& ! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
&& (code == LE || code == GE
|| code == UNEQ || code == LTGT
--- 11412,11420 ----
rs6000_compare_op1)));
/* Some kinds of FP comparisons need an OR operation;
! under flag_unsafe_math_optimizations we don't bother. */
if (rs6000_compare_fp_p
! && ! flag_unsafe_math_optimizations
&& ! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
&& (code == LE || code == GE
|| code == UNEQ || code == LTGT