54 lines
1.5 KiB
Diff
54 lines
1.5 KiB
Diff
From 89dfb9ad8687f9b31be5925b2d106b6ec13cc628 Mon Sep 17 00:00:00 2001
|
||
From: Xi Ruoyao <xry111@xry111.site>
|
||
Date: Sat, 9 Dec 2023 18:02:35 +0800
|
||
Subject: [PATCH 072/188] LoongArch: Add alslsi3_extend
|
||
|
||
Following the instruction cost fix, we are generating
|
||
|
||
alsl.w $a0, $a0, $a0, 4
|
||
|
||
instead of
|
||
|
||
li.w $t0, 17
|
||
mul.w $a0, $t0
|
||
|
||
for "x * 4", because alsl.w is 4 times faster than mul.w. But we didn't
|
||
have a sign-extending pattern for alsl.w, causing an extra slli.w
|
||
instruction generated to sign-extend $a0. Add the pattern to remove the
|
||
redundant extension.
|
||
|
||
gcc/ChangeLog:
|
||
|
||
* config/loongarch/loongarch.md (alslsi3_extend): New
|
||
define_insn.
|
||
---
|
||
gcc/config/loongarch/loongarch.md | 12 ++++++++++++
|
||
1 file changed, 12 insertions(+)
|
||
|
||
diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md
|
||
index 222f1ae83..23368008e 100644
|
||
--- a/gcc/config/loongarch/loongarch.md
|
||
+++ b/gcc/config/loongarch/loongarch.md
|
||
@@ -2874,6 +2874,18 @@
|
||
[(set_attr "type" "arith")
|
||
(set_attr "mode" "<MODE>")])
|
||
|
||
+(define_insn "alslsi3_extend"
|
||
+ [(set (match_operand:DI 0 "register_operand" "=r")
|
||
+ (sign_extend:DI
|
||
+ (plus:SI
|
||
+ (ashift:SI (match_operand:SI 1 "register_operand" "r")
|
||
+ (match_operand 2 "const_immalsl_operand" ""))
|
||
+ (match_operand:SI 3 "register_operand" "r"))))]
|
||
+ ""
|
||
+ "alsl.w\t%0,%1,%3,%2"
|
||
+ [(set_attr "type" "arith")
|
||
+ (set_attr "mode" "SI")])
|
||
+
|
||
|
||
|
||
;; Reverse the order of bytes of operand 1 and store the result in operand 0.
|
||
--
|
||
2.43.0
|
||
|