This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]