* 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).