From 401d24f9fd3e3db3f4c678e319b66d4560357479 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 8 May 2005 09:24:45 +0000 Subject: [PATCH] mips.c (mips_emit_compare): Don't reverse UNGE and UNGT comparisons. * config/mips/mips.c (mips_emit_compare): Don't reverse UNGE and UNGT comparisons. * config/mips/mips.md (swapped_fcond): New code macro and attribute. (sgt_, sge_): Generalize to all members of swapped_fcond, including sunge_ and sungt_. From-SVN: r99380 --- gcc/ChangeLog | 8 ++++++++ gcc/config/mips/mips.c | 2 -- gcc/config/mips/mips.md | 27 +++++++++++++------------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/mips/fpcmp-1.c | 6 ++++++ gcc/testsuite/gcc.target/mips/fpcmp-2.c | 6 ++++++ 6 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/fpcmp-1.c create mode 100644 gcc/testsuite/gcc.target/mips/fpcmp-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 110aecd8741..66fa3611499 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-05-08 Richard Sandiford + + * config/mips/mips.c (mips_emit_compare): Don't reverse UNGE and UNGT + comparisons. + * config/mips/mips.md (swapped_fcond): New code macro and attribute. + (sgt_, sge_): Generalize to all members of swapped_fcond, + including sunge_ and sungt_. + 2005-05-08 Richard Sandiford * integrate.h (get_hard_reg_initial_val): Change type of register diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d8b39c3bb9d..824127a411d 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -2802,8 +2802,6 @@ mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p) switch (*code) { case NE: - case UNGE: - case UNGT: case LTGT: case ORDERED: cmp_code = reverse_condition_maybe_unordered (*code); diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 9948e0627cd..e5963d4ada3 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -413,6 +413,10 @@ ;; generated from the same template. (define_code_macro fcond [unordered uneq unlt unle eq lt le]) +;; This code macro is used for comparisons that can be implemented +;; by swapping the operands. +(define_code_macro swapped_fcond [ge gt unge ungt]) + ;; expands to an empty string when doing a signed operation and ;; "u" when doing an unsigned operation. (define_code_attr u [(sign_extend "") (zero_extend "u")]) @@ -438,6 +442,12 @@ (eq "eq") (lt "lt") (le "le")]) + +;; Similar, but for swapped conditions. +(define_code_attr swapped_fcond [(ge "le") + (gt "lt") + (unge "ule") + (ungt "ult")]) ;; ......................... ;; @@ -4576,21 +4586,12 @@ beq\t%2,%.,1b\;\ [(set_attr "type" "fcmp") (set_attr "mode" "FPSW")]) -(define_insn "sgt_" - [(set (match_operand:CC 0 "register_operand" "=z") - (gt:CC (match_operand:SCALARF 1 "register_operand" "f") - (match_operand:SCALARF 2 "register_operand" "f")))] - "" - "c.lt.\t%Z0%2,%1" - [(set_attr "type" "fcmp") - (set_attr "mode" "FPSW")]) - -(define_insn "sge_" +(define_insn "s_" [(set (match_operand:CC 0 "register_operand" "=z") - (ge:CC (match_operand:SCALARF 1 "register_operand" "f") - (match_operand:SCALARF 2 "register_operand" "f")))] + (swapped_fcond:CC (match_operand:SCALARF 1 "register_operand" "f") + (match_operand:SCALARF 2 "register_operand" "f")))] "" - "c.le.\t%Z0%2,%1" + "c..\t%Z0%2,%1" [(set_attr "type" "fcmp") (set_attr "mode" "FPSW")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8ecd101dca3..fb78b25e069 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-05-08 Richard Sandiford + + * gcc.target/mips/fpcmp-[12].c: New tests. + 2005-05-06 Mark Mitchell * lib/target-supports-dg.exp (dg-require-fork): New function. diff --git a/gcc/testsuite/gcc.target/mips/fpcmp-1.c b/gcc/testsuite/gcc.target/mips/fpcmp-1.c new file mode 100644 index 00000000000..b5d087671fd --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/fpcmp-1.c @@ -0,0 +1,6 @@ +/* We used to use c.lt.fmt instead of c.ule.fmt here. */ +/* { dg-options "-mhard-float -O2" } */ +int f1 (float x, float y) { return __builtin_isless (x, y); } +int f2 (double x, double y) { return __builtin_isless (x, y); } +/* { dg-final { scan-assembler "c\\.ule\\.s" } } */ +/* { dg-final { scan-assembler "c\\.ule\\.d" } } */ diff --git a/gcc/testsuite/gcc.target/mips/fpcmp-2.c b/gcc/testsuite/gcc.target/mips/fpcmp-2.c new file mode 100644 index 00000000000..94027a8a091 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/fpcmp-2.c @@ -0,0 +1,6 @@ +/* We used to use c.le.fmt instead of c.ult.fmt here. */ +/* { dg-options "-mhard-float -O2" } */ +int f1 (float x, float y) { return __builtin_islessequal (x, y); } +int f2 (double x, double y) { return __builtin_islessequal (x, y); } +/* { dg-final { scan-assembler "c\\.ult\\.s" } } */ +/* { dg-final { scan-assembler "c\\.ult\\.d" } } */ -- 2.30.2