71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
|
|
From 2c763d7ec71ef51f8704c8c3444dd5ab9144dbc6 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Lulu Cheng <chenglulu@loongson.cn>
|
||
|
|
Date: Fri, 28 Jun 2024 15:09:48 +0800
|
||
|
|
Subject: [PATCH 07/20] LoongArch: Define loongarch_insn_cost and set the cost
|
||
|
|
of movcf2gr and movgr2cf.
|
||
|
|
|
||
|
|
The following two FAIL items have been fixed:
|
||
|
|
|
||
|
|
FAIL: gcc.target/loongarch/movcf2gr-via-fr.c scan-assembler movcf2fr\\t\\\\\$f[0-9]+,\\\\\$fcc
|
||
|
|
FAIL: gcc.target/loongarch/movcf2gr-via-fr.c scan-assembler movfr2gr\\\\.s\\t\\\\\$r4
|
||
|
|
|
||
|
|
gcc/ChangeLog:
|
||
|
|
|
||
|
|
* config/loongarch/loongarch.cc (loongarch_insn_cost):
|
||
|
|
New function.
|
||
|
|
(TARGET_INSN_COST): New macro.
|
||
|
|
---
|
||
|
|
gcc/config/loongarch/loongarch.cc | 29 +++++++++++++++++++++++++++++
|
||
|
|
1 file changed, 29 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
|
||
|
|
index 9148ebcbc..2b2f3c613 100644
|
||
|
|
--- a/gcc/config/loongarch/loongarch.cc
|
||
|
|
+++ b/gcc/config/loongarch/loongarch.cc
|
||
|
|
@@ -4372,6 +4372,33 @@ loongarch_address_cost (rtx addr, machine_mode mode,
|
||
|
|
return loongarch_address_insns (addr, mode, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
+/* Implement TARGET_INSN_COST. */
|
||
|
|
+
|
||
|
|
+static int
|
||
|
|
+loongarch_insn_cost (rtx_insn *insn, bool speed)
|
||
|
|
+{
|
||
|
|
+ rtx x = PATTERN (insn);
|
||
|
|
+ int cost = pattern_cost (x, speed);
|
||
|
|
+
|
||
|
|
+ /* On LA464, prevent movcf2fr and movfr2gr from merging into movcf2gr. */
|
||
|
|
+ if (GET_CODE (x) == SET
|
||
|
|
+ && GET_MODE (XEXP (x, 0)) == FCCmode)
|
||
|
|
+ {
|
||
|
|
+ rtx dest, src;
|
||
|
|
+ dest = XEXP (x, 0);
|
||
|
|
+ src = XEXP (x, 1);
|
||
|
|
+
|
||
|
|
+ if (REG_P (dest) && REG_P (src))
|
||
|
|
+ {
|
||
|
|
+ if (GP_REG_P (REGNO (dest)) && FCC_REG_P (REGNO (src)))
|
||
|
|
+ cost = loongarch_cost->movcf2gr;
|
||
|
|
+ else if (FCC_REG_P (REGNO (dest)) && GP_REG_P (REGNO (src)))
|
||
|
|
+ cost = loongarch_cost->movgr2cf;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+ return cost;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
/* Return one word of double-word value OP, taking into account the fixed
|
||
|
|
endianness of certain registers. HIGH_P is true to select the high part,
|
||
|
|
false to select the low part. */
|
||
|
|
@@ -11093,6 +11120,8 @@ loongarch_asm_code_end (void)
|
||
|
|
#define TARGET_RTX_COSTS loongarch_rtx_costs
|
||
|
|
#undef TARGET_ADDRESS_COST
|
||
|
|
#define TARGET_ADDRESS_COST loongarch_address_cost
|
||
|
|
+#undef TARGET_INSN_COST
|
||
|
|
+#define TARGET_INSN_COST loongarch_insn_cost
|
||
|
|
#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
|
||
|
|
#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
|
||
|
|
loongarch_builtin_vectorization_cost
|
||
|
|
--
|
||
|
|
2.43.0
|
||
|
|
|