From: Jeff Law <jeffreyalaw@gmail.com>
To: Palmer Dabbelt <palmer@dabbelt.com>, christoph.muellner@vrull.eu
Cc: gcc-patches@gcc.gnu.org, kito.cheng@sifive.com,
Jim Wilson <jim.wilson.gcc@gmail.com>,
Andrew Waterman <andrew@sifive.com>,
philipp.tomsich@vrull.eu, Vineet Gupta <vineetg@rivosinc.com>
Subject: Re: [PATCH v2 1/2] riscv: Add support for strlen inline expansion
Date: Wed, 6 Sep 2023 10:47:05 -0600 [thread overview]
Message-ID: <43e79ddd-882a-421b-81fe-7830e37d711e@gmail.com> (raw)
In-Reply-To: <mhng-56fb0687-9274-498b-be3d-c0c69f065da0@palmer-ri-x1c9>
On 9/6/23 10:22, Palmer Dabbelt wrote:
> On Wed, 06 Sep 2023 09:07:33 PDT (-0700), christoph.muellner@vrull.eu
> wrote:
>> From: Christoph Müllner <christoph.muellner@vrull.eu>
>>
>> This patch implements the expansion of the strlen builtin for RV32/RV64
>> for xlen-aligned aligned strings if Zbb or XTheadBb instructions are
>> available.
>> The inserted sequences are:
>>
>> rv32gc_zbb (RV64 is similar):
>> add a3,a0,4
>> li a4,-1
>> .L1: lw a5,0(a0)
>> add a0,a0,4
>> orc.b a5,a5
>> beq a5,a4,.L1
>> not a5,a5
>> ctz a5,a5
>> srl a5,a5,0x3
>> add a0,a0,a5
>> sub a0,a0,a3
>>
>> rv64gc_xtheadbb (RV32 is similar):
>> add a4,a0,8
>> .L2: ld a5,0(a0)
>> add a0,a0,8
>> th.tstnbz a5,a5
>> beqz a5,.L2
>> th.rev a5,a5
>> th.ff1 a5,a5
>> srl a5,a5,0x3
>> add a0,a0,a5
>> sub a0,a0,a4
>>
>> This allows to inline calls to strlen(), with optimized code for
>> xlen-aligned strings, resulting in the following benefits over
>> a call to libc:
>> * no call/ret instructions
>> * no stack frame allocation
>> * no register saving/restoring
>> * no alignment test
>>
>> The inlining mechanism is gated by a new switch ('-minline-strlen')
>> and by the variable 'optimize_size'.
>
> Maybe this is more of a Jeff question, but this looks to me like
> something that should be target-agnostic -- maybe we need some backend
> work to actually emit the special instruction, but IIRC this is a
> somewhat common flavor of instruction and is in other ISAs as well. It
> looks like there's already a strlen insn, so I guess the core issue is
> why we need that unspec?
>
> Sorry if I'm just missing something, though...
The generic strlen expansion in GCC doesn't really expand a strlen loop.
It really just calls into the target code and forces the target to
handle everything.
We could have generic strlen expansion code that kicks in if the target
expander fails. And we could probably create the necessary opcodes to
express the optimized end-of-string comparison instructions that exist
on various architectures. I'm not not sure it's worth that much effort
given targets are already doing their own strlen expansions.
jeff
next prev parent reply other threads:[~2023-09-06 16:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-06 16:07 [PATCH v2 0/2] riscv: Introduce strlen/strcmp/strncmp " Christoph Muellner
2023-09-06 16:07 ` [PATCH v2 1/2] riscv: Add support for strlen " Christoph Muellner
2023-09-06 16:22 ` Palmer Dabbelt
2023-09-06 16:47 ` Jeff Law [this message]
2023-09-06 19:29 ` Palmer Dabbelt
2023-09-12 3:28 ` Jeff Law
2023-09-12 9:38 ` Philipp Tomsich
2023-09-06 16:07 ` [PATCH v2 2/2] riscv: Add support for str(n)cmp " Christoph Muellner
2023-09-12 3:34 ` Jeff Law
2023-09-12 9:38 ` Philipp Tomsich
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=43e79ddd-882a-421b-81fe-7830e37d711e@gmail.com \
--to=jeffreyalaw@gmail.com \
--cc=andrew@sifive.com \
--cc=christoph.muellner@vrull.eu \
--cc=gcc-patches@gcc.gnu.org \
--cc=jim.wilson.gcc@gmail.com \
--cc=kito.cheng@sifive.com \
--cc=palmer@dabbelt.com \
--cc=philipp.tomsich@vrull.eu \
--cc=vineetg@rivosinc.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).