diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 75b37b53244..d03e51f3a68 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3601,6 +3601,11 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN if (outer_code == INSN && register_operand (SET_DEST (x), GET_MODE (SET_DEST (x)))) { + if (REG_P (SET_SRC (x)) && TARGET_DOUBLE_FLOAT && mode == DFmode) + { + *total = COSTS_N_INSNS (1); + return true; + } riscv_rtx_costs (SET_SRC (x), mode, outer_code, opno, total, speed); return true; } diff --git a/gcc/testsuite/gcc.target/riscv/rv32-movdf-cost.c b/gcc/testsuite/gcc.target/riscv/rv32-movdf-cost.c new file mode 100644 index 00000000000..cb679e7b95f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rv32-movdf-cost.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32imafdc -mabi=ilp32d" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ + +double foo (int t, double a, double b) +{ + if (t > 0) + return a; + else + return b; +} + +/* { dg-final { scan-assembler-not "fsd\t" } } */