public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* patch: e500 fp fixes
@ 2004-07-28 18:30 Aldy Hernandez
  0 siblings, 0 replies; only message in thread
From: Aldy Hernandez @ 2004-07-28 18:30 UTC (permalink / raw)
  To: gcc-patches

More fixes.  I messed up last time around.  I found some more
corner cases in FP comparisons that were handled incorrectly.  This
patch fixes a couple regressions, and the spec2k building problem.

Applied to mainline and 3.4 branch.

Cheers.


	* config/rs6000/rs6000.md ("move_from_CR_gt_bit"): Rename to
	move_from_CR_eq_bit.
	Rename UNSPEC_MV_CR_GT to UNSPEC_MV_CR_EQ.
	

	* config/rs6000/spe.md ("e500_flip_gt_bit"): Rename to
	e500_flip_eq_bit.

	* config/rs6000/rs6000-protos.h: Rename output_e500_flip_gt_bit to
	output_e500_flip_eq_bit.

	* config/rs6000/rs6000.c (output_e500_flip_gt_bit): Rename to
	output_e500_flip_eq_bit.
	(rs6000_emit_sCOND): Rename call to output_e500_flip_gt_bit to
	output_e500_flip_eq_bit.
	Rename gen_move_from_CR_gt_bit to gen_move_from_CR_eq_bit.
	(print_operand): case D.  Get to EQ bit.

Index: config/rs6000/rs6000.md
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.md,v
retrieving revision 1.312
diff -c -p -r1.312 rs6000.md
*** config/rs6000/rs6000.md	15 Jul 2004 21:07:49 -0000	1.312
--- config/rs6000/rs6000.md	28 Jul 2004 12:09:11 -0000
***************
*** 50,56 ****
     (UNSPEC_TLSGOTTPREL		28)
     (UNSPEC_TLSTLS		29)
     (UNSPEC_FIX_TRUNC_TF		30)	; fadd, rounding towards zero
!    (UNSPEC_MV_CR_GT		31)	; move_from_CR_gt_bit
    ])
  
  ;;
--- 50,56 ----
     (UNSPEC_TLSGOTTPREL		28)
     (UNSPEC_TLSTLS		29)
     (UNSPEC_FIX_TRUNC_TF		30)	; fadd, rounding towards zero
!    (UNSPEC_MV_CR_EQ		31)	; move_from_CR_eq_bit
    ])
  
  ;;
***************
*** 11396,11404 ****
     (set_attr "length" "12")])
  
  ;; Same as above, but get the GT bit.
! (define_insn "move_from_CR_gt_bit"
    [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
! 	(unspec:SI [(match_operand 1 "cc_reg_operand" "y")] UNSPEC_MV_CR_GT))]
    "TARGET_E500"
    "mfcr %0\;{rlinm|rlwinm} %0,%0,%D1,1"
    [(set_attr "type" "mfcr")
--- 11396,11404 ----
     (set_attr "length" "12")])
  
  ;; Same as above, but get the GT bit.
! (define_insn "move_from_CR_eq_bit"
    [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
! 	(unspec:SI [(match_operand 1 "cc_reg_operand" "y")] UNSPEC_MV_CR_EQ))]
    "TARGET_E500"
    "mfcr %0\;{rlinm|rlwinm} %0,%0,%D1,1"
    [(set_attr "type" "mfcr")
Index: config/rs6000/spe.md
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/spe.md,v
retrieving revision 1.25
diff -c -p -r1.25 spe.md
*** config/rs6000/spe.md	15 Jul 2004 21:02:15 -0000	1.25
--- config/rs6000/spe.md	28 Jul 2004 12:09:12 -0000
***************
*** 2458,2471 ****
  ;; FP comparison stuff.
  
  ;; Flip the GT bit.
! (define_insn "e500_flip_gt_bit"
    [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
  	(unspec:CCFP
  	 [(match_operand:CCFP 1 "cc_reg_operand" "y")] 999))]
    "!TARGET_FPRS && TARGET_HARD_FLOAT"
    "*
  {
!   return output_e500_flip_gt_bit (operands[0], operands[1]);
  }"
    [(set_attr "type" "cr_logical")])
  
--- 2458,2471 ----
  ;; FP comparison stuff.
  
  ;; Flip the GT bit.
! (define_insn "e500_flip_eq_bit"
    [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
  	(unspec:CCFP
  	 [(match_operand:CCFP 1 "cc_reg_operand" "y")] 999))]
    "!TARGET_FPRS && TARGET_HARD_FLOAT"
    "*
  {
!   return output_e500_flip_eq_bit (operands[0], operands[1]);
  }"
    [(set_attr "type" "cr_logical")])
  
Index: config/rs6000/rs6000-protos.h
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000-protos.h,v
retrieving revision 1.84
diff -c -p -r1.84 rs6000-protos.h
*** config/rs6000/rs6000-protos.h	14 Jul 2004 06:24:21 -0000	1.84
--- config/rs6000/rs6000-protos.h	28 Jul 2004 12:09:12 -0000
*************** extern enum rtx_code rs6000_reverse_cond
*** 117,123 ****
  extern void rs6000_emit_sCOND (enum rtx_code, rtx);
  extern void rs6000_emit_cbranch (enum rtx_code, rtx);
  extern char * output_cbranch (rtx, const char *, int, rtx);
! extern char * output_e500_flip_gt_bit (rtx, rtx);
  extern rtx rs6000_emit_set_const (rtx, enum machine_mode, rtx, int);
  extern int rs6000_emit_cmove (rtx, rtx, rtx, rtx);
  extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
--- 117,123 ----
  extern void rs6000_emit_sCOND (enum rtx_code, rtx);
  extern void rs6000_emit_cbranch (enum rtx_code, rtx);
  extern char * output_cbranch (rtx, const char *, int, rtx);
! extern char * output_e500_flip_eq_bit (rtx, rtx);
  extern rtx rs6000_emit_set_const (rtx, enum machine_mode, rtx, int);
  extern int rs6000_emit_cmove (rtx, rtx, rtx, rtx);
  extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.668
diff -c -p -r1.668 rs6000.c
*** config/rs6000/rs6000.c	14 Jul 2004 21:19:35 -0000	1.668
--- config/rs6000/rs6000.c	28 Jul 2004 12:09:19 -0000
*************** print_operand (FILE *file, rtx x, int co
*** 9605,9616 ****
        return;
  
      case 'D':
!       /* Like 'J' but get to the GT bit.  */
        if (GET_CODE (x) != REG)
  	abort ();
  
!       /* Bit 1 is GT bit.  */
!       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
  
        /* If we want bit 31, write a shift count of zero, not 32.  */
        fprintf (file, "%d", i == 31 ? 0 : i + 1);
--- 9605,9616 ----
        return;
  
      case 'D':
!       /* Like 'J' but get to the EQ bit.  */
        if (GET_CODE (x) != REG)
  	abort ();
  
!       /* Bit 1 is EQ bit.  */
!       i = 4 * (REGNO (x) - CR0_REGNO) + 2;
  
        /* If we want bit 31, write a shift count of zero, not 32.  */
        fprintf (file, "%d", i == 31 ? 0 : i + 1);
*************** rs6000_emit_sCOND (enum rtx_code code, r
*** 10568,10576 ****
  	abort ();
  
        if (cond_code == NE)
! 	emit_insn (gen_e500_flip_gt_bit (t, t));
  
!       emit_insn (gen_move_from_CR_gt_bit (result, t));
        return;
      }
  
--- 10568,10576 ----
  	abort ();
  
        if (cond_code == NE)
! 	emit_insn (gen_e500_flip_eq_bit (t, t));
  
!       emit_insn (gen_move_from_CR_eq_bit (result, t));
        return;
      }
  
*************** output_cbranch (rtx op, const char *labe
*** 10751,10759 ****
    return string;
  }
  
! /* Return the string to flip the GT bit on a CR.  */
  char *
! output_e500_flip_gt_bit (rtx dst, rtx src)
  {
    static char string[64];
    int a, b;
--- 10751,10759 ----
    return string;
  }
  
! /* Return the string to flip the EQ bit on a CR.  */
  char *
! output_e500_flip_eq_bit (rtx dst, rtx src)
  {
    static char string[64];
    int a, b;
*************** output_e500_flip_gt_bit (rtx dst, rtx sr
*** 10762,10770 ****
        || GET_CODE (src) != REG || ! CR_REGNO_P (REGNO (src)))
      abort ();
  
!   /* GT bit.  */
!   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
!   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
  
    sprintf (string, "crnot %d,%d", a, b);
    return string;
--- 10762,10770 ----
        || GET_CODE (src) != REG || ! CR_REGNO_P (REGNO (src)))
      abort ();
  
!   /* EQ bit.  */
!   a = 4 * (REGNO (dst) - CR0_REGNO) + 2;
!   b = 4 * (REGNO (src) - CR0_REGNO) + 2;
  
    sprintf (string, "crnot %d,%d", a, b);
    return string;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-07-28 12:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-07-28 18:30 patch: e500 fp fixes Aldy Hernandez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).