public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work164-bugs)] Add power10 ori/oris and xori/xoris fusion support.
@ 2024-04-09 21:41 Michael Meissner
0 siblings, 0 replies; 2+ messages in thread
From: Michael Meissner @ 2024-04-09 21:41 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:a0937c1e3b69500a19eef7816ccb0dab3f03e80b
commit a0937c1e3b69500a19eef7816ccb0dab3f03e80b
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Tue Apr 9 17:40:58 2024 -0400
Add power10 ori/oris and xori/xoris fusion support.
2024-04-09 Michael Meissner <meissner@linux.ibm.com>
gcc/
* config/rs6000/fusion.md: Regenerate.
* config/rs6000/genfusion.md (gen_wide_immediate): Add wide immediate
fusion patterns.
* config/rs6000/predicates.md (u32bit_cint_2_insns_operand): New predicate.
* config/rs6000/rs6000.md (IORXOR_OP): New code attribute.
(ior, xor splitter): Do not split ior/xor patterns that could be fused
on power10.
Make sure wide immediate fusion does not generate illegal instructions.
Diff:
---
gcc/config/rs6000/fusion.md | 15 +++++++++++++++
gcc/config/rs6000/genfusion.pl | 22 ++++++++++++++++++++++
gcc/config/rs6000/predicates.md | 9 +++++++++
gcc/config/rs6000/rs6000.md | 5 ++++-
4 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/gcc/config/rs6000/fusion.md b/gcc/config/rs6000/fusion.md
index 4ed9ae1d69f..5feedf83cad 100644
--- a/gcc/config/rs6000/fusion.md
+++ b/gcc/config/rs6000/fusion.md
@@ -3055,3 +3055,18 @@
[(set_attr "type" "fused_vector")
(set_attr "cost" "6")
(set_attr "length" "8")])
+
+;; ori_oris and xori_xoris fusion patterns generated by gen_wide_immediate
+(define_insn "*fuse_<IORXOR_OP>i_<IORXOR_OP>is"
+ [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
+ (iorxor:DI
+ (match_operand:DI 1 "gpc_reg_operand" "r")
+ (match_operand:DI 2 "u32bit_cint_2_insns_operand" "n")))]
+ "(TARGET_P10_FUSION)"
+{
+ HOST_WIDE_INT value = INTVAL (operands[2]);
+ operands[3] = GEN_INT (value & 0xffff);
+ operands[4] = GEN_INT ((value >> 16) & 0xffff);
+ return "<IORXOR_OP>i %0,%1,%3\;<IORXOR_OP>is %0,%0,%4";
+}
+ [(set_attr "length" "8")])
diff --git a/gcc/config/rs6000/genfusion.pl b/gcc/config/rs6000/genfusion.pl
index 2271be14bfa..b6f1016b830 100755
--- a/gcc/config/rs6000/genfusion.pl
+++ b/gcc/config/rs6000/genfusion.pl
@@ -367,6 +367,28 @@ EOF
}
}
+sub gen_wide_immediate
+{
+ print <<"EOF";
+
+;; ori_oris and xori_xoris fusion patterns generated by gen_wide_immediate
+(define_insn "*fuse_<IORXOR_OP>i_<IORXOR_OP>is"
+ [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
+ (iorxor:DI
+ (match_operand:DI 1 "gpc_reg_operand" "r")
+ (match_operand:DI 2 "u32bit_cint_2_insns_operand" "n")))]
+ "(TARGET_P10_FUSION)"
+{
+ HOST_WIDE_INT value = INTVAL (operands[2]);
+ operands[3] = GEN_INT (value & 0xffff);
+ operands[4] = GEN_INT ((value >> 16) & 0xffff);
+ return "<IORXOR_OP>i %0,%1,%3\\;<IORXOR_OP>is %0,%0,%4";
+}
+ [(set_attr "length" "8")])
+EOF
+}
+
gen_ld_cmpi_p10();
gen_logical_addsubf();
gen_addadd;
+gen_wide_immediate();
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index d23ce9a77a3..83f368b2916 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -282,6 +282,15 @@
(and (match_code "const_int")
(match_test "(0x80000000 + UINTVAL (op)) >> 32 == 0")))
+;; Return 1 if op is a 32-bit unsigned constant where the upper 16-bits is
+;; non-zero along with the lower 16-bits that needs two instructions (ORI/ORIS
+;; or XORI/XORIS to do the operation).
+(define_predicate "u32bit_cint_2_insns_operand"
+ (and (match_code "const_int")
+ (match_test "(INTVAL (op) >> 32) == 0")
+ (match_test "(INTVAL (op) & 0xffff) != 0")
+ (match_test "(INTVAL (op) & 0xffff0000) != 0")))
+
;; Return 1 if op is a constant 32-bit unsigned
(define_predicate "c32bit_cint_operand"
(and (match_code "const_int")
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 1acd34ca0ee..f626b68ebb2 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -822,6 +822,9 @@
(SF "TARGET_P8_VECTOR")
(DI "TARGET_POWERPC64")])
+;; Convert iorxor iterator into or/xor instruction
+(define_code_attr IORXOR_OP [(ior "or") (xor "xor")])
+
(include "darwin.md")
\f
;; Start with fixed-point load and store insns. Here we put only the more
@@ -3933,7 +3936,7 @@
[(set (match_operand:GPR 0 "gpc_reg_operand")
(iorxor:GPR (match_operand:GPR 1 "gpc_reg_operand")
(match_operand:GPR 2 "non_logical_cint_operand")))]
- ""
+ "<MODE>mode != DImode || !TARGET_P10_FUSION"
[(set (match_dup 3)
(iorxor:GPR (match_dup 1)
(match_dup 4)))
^ permalink raw reply [flat|nested] 2+ messages in thread
* [gcc(refs/users/meissner/heads/work164-bugs)] Add power10 ori/oris and xori/xoris fusion support.
@ 2024-04-09 4:31 Michael Meissner
0 siblings, 0 replies; 2+ messages in thread
From: Michael Meissner @ 2024-04-09 4:31 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:9b813c320ee59176e3279391ef7c47ef6ea8ba3a
commit 9b813c320ee59176e3279391ef7c47ef6ea8ba3a
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Tue Apr 9 00:30:46 2024 -0400
Add power10 ori/oris and xori/xoris fusion support.
2024-04-09 Michael Meissner <meissner@linux.ibm.com>
gcc/
* config/rs6000/fusion.md: Regenerate.
* config/rs6000/genfusion.md (gen_wide_immediate): Add wide immediate
fusion patterns.
* config/rs6000/rs6000.md (IORXOR_OP): New code attribute.
(ior, xor splitter): Do not split ior/xor patterns that could be fused
on power10.
Diff:
---
gcc/config/rs6000/fusion.md | 10 ++++++++++
gcc/config/rs6000/genfusion.pl | 17 +++++++++++++++++
gcc/config/rs6000/rs6000.md | 5 ++++-
3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/gcc/config/rs6000/fusion.md b/gcc/config/rs6000/fusion.md
index 4ed9ae1d69f..45819627df6 100644
--- a/gcc/config/rs6000/fusion.md
+++ b/gcc/config/rs6000/fusion.md
@@ -3055,3 +3055,13 @@
[(set_attr "type" "fused_vector")
(set_attr "cost" "6")
(set_attr "length" "8")])
+
+;; ori_oris and xori_xoris fusion patterns generated by gen_wide_immediate
+(define_insn "*fuse_<IORXOR_OP>i_<IORXOR_OP>is"
+ [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
+ (iorxor:DI
+ (match_operand:DI 1 "gpc_reg_operand" "r")
+ (match_operand:DI 2 "non_logical_cint_operand" "n")))]
+ "(TARGET_P10_FUSION)"
+ "<IORXOR_OP>i %0,%1,%w2\;<IORXOR_OP>is %0,%0,%v2"
+ [(set_attr "length" "8")])
diff --git a/gcc/config/rs6000/genfusion.pl b/gcc/config/rs6000/genfusion.pl
index 2271be14bfa..d059de8afc9 100755
--- a/gcc/config/rs6000/genfusion.pl
+++ b/gcc/config/rs6000/genfusion.pl
@@ -367,6 +367,23 @@ EOF
}
}
+sub gen_wide_immediate
+{
+ print <<"EOF";
+
+;; ori_oris and xori_xoris fusion patterns generated by gen_wide_immediate
+(define_insn "*fuse_<IORXOR_OP>i_<IORXOR_OP>is"
+ [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
+ (iorxor:DI
+ (match_operand:DI 1 "gpc_reg_operand" "r")
+ (match_operand:DI 2 "non_logical_cint_operand" "n")))]
+ "(TARGET_P10_FUSION)"
+ "<IORXOR_OP>i %0,%1,%w2\\;<IORXOR_OP>is %0,%0,%v2"
+ [(set_attr "length" "8")])
+EOF
+}
+
gen_ld_cmpi_p10();
gen_logical_addsubf();
gen_addadd;
+gen_wide_immediate();
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 1acd34ca0ee..f626b68ebb2 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -822,6 +822,9 @@
(SF "TARGET_P8_VECTOR")
(DI "TARGET_POWERPC64")])
+;; Convert iorxor iterator into or/xor instruction
+(define_code_attr IORXOR_OP [(ior "or") (xor "xor")])
+
(include "darwin.md")
\f
;; Start with fixed-point load and store insns. Here we put only the more
@@ -3933,7 +3936,7 @@
[(set (match_operand:GPR 0 "gpc_reg_operand")
(iorxor:GPR (match_operand:GPR 1 "gpc_reg_operand")
(match_operand:GPR 2 "non_logical_cint_operand")))]
- ""
+ "<MODE>mode != DImode || !TARGET_P10_FUSION"
[(set (match_dup 3)
(iorxor:GPR (match_dup 1)
(match_dup 4)))
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-04-09 21:41 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-09 21:41 [gcc(refs/users/meissner/heads/work164-bugs)] Add power10 ori/oris and xori/xoris fusion support Michael Meissner
-- strict thread matches above, loose matches on Subject: below --
2024-04-09 4:31 Michael Meissner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).