Commit a9a06ed6 authored by rsandifo's avatar rsandifo
Browse files

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
parent c0aa46db
2007-10-05 Richard Sandiford <rsandifo@nildram.co.uk>
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 <dougkwan@google.com>
 
* gthr-posix.h (__gthread_cond_broadcast, __gthread_cond_wait,
......@@ -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;
}
......
2007-10-05 Richard Sandiford <rsandifo@nildram.co.uk>
PR target/33635
* gcc.target/mips/pr33635-1.c: New test.
2007-10-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
 
PR libfortran/33253
/* { 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;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment