From a9a06ed68c79b7c5dc6b9c6ed6e649ebaae614fe Mon Sep 17 00:00:00 2001 From: rsandifo Date: Fri, 5 Oct 2007 08:34:01 +0000 Subject: [PATCH] gcc/ PR target/33635 * config/mips/mips.c (mips_register_move_cost): Rewrite to use subset checks. Make the cost of FPR -> FPR moves depend on mips_mode_ok_for_mov_fmt_p. gcc/testsuite/ PR target/33635 * gcc.target/mips/pr33635-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129031 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++ gcc/config/mips/mips.c | 79 +++++++++++++------------------ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.target/mips/pr33635-1.c | 13 +++++ 4 files changed, 57 insertions(+), 47 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/pr33635-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3dabeea2f41..fba43b2cb0c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-10-05 Richard Sandiford + + PR target/33635 + * config/mips/mips.c (mips_register_move_cost): Rewrite to use + subset checks. Make the cost of FPR -> FPR moves depend on + mips_mode_ok_for_mov_fmt_p. + 2007-10-04 Doug Kwan * gthr-posix.h (__gthread_cond_broadcast, __gthread_cond_wait, diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 64377b54d1d..889997d8c33 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -10969,69 +10969,54 @@ mips_init_libfuncs (void) we need to use. This gets pretty messy, but it is feasible. */ int -mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, +mips_register_move_cost (enum machine_mode mode, enum reg_class to, enum reg_class from) { - if (from == M16_REGS && reg_class_subset_p (to, GENERAL_REGS)) - return 2; - else if (from == M16_NA_REGS && reg_class_subset_p (to, GENERAL_REGS)) - return 2; - else if (reg_class_subset_p (from, GENERAL_REGS)) + if (TARGET_MIPS16) { - if (to == M16_REGS) - return 2; - else if (to == M16_NA_REGS) - return 2; - else if (reg_class_subset_p (to, GENERAL_REGS)) + if (reg_class_subset_p (from, GENERAL_REGS) + && reg_class_subset_p (to, GENERAL_REGS)) { - if (TARGET_MIPS16) - return 4; - else + if (reg_class_subset_p (from, M16_REGS) + || reg_class_subset_p (to, M16_REGS)) return 2; - } - else if (to == FP_REGS) - return 4; - else if (reg_class_subset_p (to, ACC_REGS)) - { - if (TARGET_MIPS16) - return 12; - else - return 6; - } - else if (reg_class_subset_p (to, ALL_COP_REGS)) - { - return 5; + /* Two MOVEs. */ + return 4; } } - else if (from == FP_REGS) + else if (reg_class_subset_p (from, GENERAL_REGS)) { if (reg_class_subset_p (to, GENERAL_REGS)) - return 4; - else if (to == FP_REGS) return 2; - else if (to == ST_REGS) - return 8; + if (reg_class_subset_p (to, FP_REGS)) + return 4; + if (reg_class_subset_p (to, ALL_COP_AND_GR_REGS)) + return 5; + if (reg_class_subset_p (to, ACC_REGS)) + return 6; } - else if (reg_class_subset_p (from, ACC_REGS)) + else if (reg_class_subset_p (to, GENERAL_REGS)) { - if (reg_class_subset_p (to, GENERAL_REGS)) - { - if (TARGET_MIPS16) - return 12; - else - return 6; - } + if (reg_class_subset_p (from, FP_REGS)) + return 4; + if (reg_class_subset_p (from, ST_REGS)) + /* LUI followed by MOVF. */ + return 4; + if (reg_class_subset_p (from, ALL_COP_AND_GR_REGS)) + return 5; + if (reg_class_subset_p (from, ACC_REGS)) + return 6; } - else if (from == ST_REGS && reg_class_subset_p (to, GENERAL_REGS)) - return 4; - else if (reg_class_subset_p (from, ALL_COP_REGS)) + else if (reg_class_subset_p (from, FP_REGS)) { - return 5; + if (reg_class_subset_p (to, FP_REGS) + && mips_mode_ok_for_mov_fmt_p (mode)) + return 4; + if (reg_class_subset_p (to, ST_REGS)) + /* An expensive sequence. */ + return 8; } - /* Fall through. - ??? What cases are these? Shouldn't we return 2 here? */ - return 12; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ef0d60d655..2252f679a02 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-05 Richard Sandiford + + PR target/33635 + * gcc.target/mips/pr33635-1.c: New test. + 2007-10-04 Jerry DeLisle PR libfortran/33253 diff --git a/gcc/testsuite/gcc.target/mips/pr33635-1.c b/gcc/testsuite/gcc.target/mips/pr33635-1.c new file mode 100644 index 00000000000..44a804ef967 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/pr33635-1.c @@ -0,0 +1,13 @@ +/* { dg-mips-options "-mabi=64 -O2" } */ + +long double __powitf2 (long double x, int m) +{ + long double y = x; + while (m >>= 1) + { + x = x * x; + if (m % 2) + y = y * x; + } + return y; +} -- 2.11.0