From: "Roger Sayle" <roger@nextmovesoftware.com>
To: "'GCC Patches'" <gcc-patches@gcc.gnu.org>
Cc: "'John David Anglin'" <dave.anglin@bell.net>,
"'Jeff Law'" <law@redhat.com>
Subject: [PATCH] hppa: Improve expansion of ashldi3 when !TARGET_64BIT
Date: Fri, 21 Aug 2020 13:53:15 +0100 [thread overview]
Message-ID: <044501d677ba$099a5520$1cceff60$@nextmovesoftware.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1801 bytes --]
This patch improves the code generated on PA-RISC for DImode
(double word) left shifts by small constants (1-31). This target
has a very cool shd instruction that can be recognized by combine
for simple shifts, but relying on combine is fragile for more
complicated functions. This patch tweaks pa.md's ashldi3 expander,
to form the optimal two instruction shd/zdep sequence at RTL
expansion time.
As an example of the benefits of this approach, the simple function
unsigned long long u9(unsigned long long x) { return x*9; }
currently generates 9 instructions
u9: copy %r25,%r28
copy %r26,%r29
extru %r26,2,3,%r21
zdep %r25,28,29,%r19
zdep %r26,28,29,%r20
or %r21,%r19,%r19
add %r29,%r20,%r29
addc %r28,%r19,%r28
bv,n %r0(%r2)
and with this patch now requires only 7:
u9: copy %r25,%r28
copy %r26,%r29
shd %r26,%r25,29,%r19
zdep %r26,28,29,%r20
add %r29,%r20,%r29
addc %r28,%r19,%r28
bv,n %r0(%r2)
This improvement is a first step towards getting synth_mult to
behave sanely on hppa (PR middle-end/87256).
Unfortunately, it's been a long while since I've had access to a
hppa system, so apart from building a cross-compiler and looking at
the assembler it generates, this patch is completely untested.
I was wondering whether Dave or Jeff (or someone else with access
to real hardware) might "spin" this patch for me?
2020-08-21 Roger Sayle <roger@nextmovesoftware.com>
* config/pa/pa.md (ashldi3): Additionally, on !TARGET_64BIT
generate a two instruction shd/zdep sequence when shifting
registers by suitable constants.
(shd_internal): New define_expand to provide gen_shd_internal.
Thanks in advance,
Roger
--
Roger Sayle
NextMove Software
Cambridge, UK
[-- Attachment #2: patchh1.txt --]
[-- Type: text/plain, Size: 1765 bytes --]
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 6350c68..e7b7635 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -6416,9 +6416,32 @@
[(set (match_operand:DI 0 "register_operand" "")
(ashift:DI (match_operand:DI 1 "lhs_lshift_operand" "")
(match_operand:DI 2 "arith32_operand" "")))]
- "TARGET_64BIT"
+ ""
"
{
+ if (!TARGET_64BIT)
+ {
+ if (REG_P (operands[0]) && GET_CODE (operands[2]) == CONST_INT)
+ {
+ unsigned HOST_WIDE_INT shift = UINTVAL (operands[2]);
+ if (shift >= 1 && shift <= 31)
+ {
+ rtx dst = operands[0];
+ rtx src = force_reg (DImode, operands[1]);
+ emit_insn (gen_shd_internal (gen_highpart (SImode, dst),
+ gen_highpart (SImode, src),
+ GEN_INT (32-shift),
+ gen_lowpart (SImode, src),
+ GEN_INT (shift)));
+ emit_insn (gen_ashlsi3 (gen_lowpart (SImode, dst),
+ gen_lowpart (SImode, src),
+ GEN_INT (shift)));
+ DONE;
+ }
+ }
+ /* Fallback to using optabs.c's expand_doubleword_shift. */
+ FAIL;
+ }
if (GET_CODE (operands[2]) != CONST_INT)
{
rtx temp = gen_reg_rtx (DImode);
@@ -6705,6 +6728,15 @@
[(set_attr "type" "shift")
(set_attr "length" "4")])
+(define_expand "shd_internal"
+ [(set (match_operand:SI 0 "register_operand")
+ (ior:SI
+ (lshiftrt:SI (match_operand:SI 1 "register_operand")
+ (match_operand:SI 2 "const_int_operand"))
+ (ashift:SI (match_operand:SI 3 "register_operand")
+ (match_operand:SI 4 "const_int_operand"))))]
+ "")
+
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=r")
(and:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
next reply other threads:[~2020-08-21 12:53 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-21 12:53 Roger Sayle [this message]
2020-08-21 19:00 ` John David Anglin
2020-08-22 8:52 ` Roger Sayle
2020-08-22 12:57 ` John David Anglin
2020-08-22 16:01 ` Roger Sayle
2020-08-22 22:09 ` John David Anglin
2020-08-22 23:24 ` Roger Sayle
2020-08-26 20:08 ` Jeff Law
2020-08-26 20:33 ` John David Anglin
2020-08-26 21:23 ` Roger Sayle
2020-08-26 21:30 ` Jeff Law
2020-08-27 0:31 ` John David Anglin
2020-08-27 7:16 ` Roger Sayle
2020-08-27 10:33 ` Richard Biener
2020-09-12 15:41 ` John David Anglin
2020-08-25 14:05 ` Jeff Law
2020-08-25 14:35 ` John David Anglin
2020-08-24 15:42 ` Jeff Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='044501d677ba$099a5520$1cceff60$@nextmovesoftware.com' \
--to=roger@nextmovesoftware.com \
--cc=dave.anglin@bell.net \
--cc=gcc-patches@gcc.gnu.org \
--cc=law@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).