riscv: Implement Zbb based strlen and prefer it over the RVV based strlen implementation when Zbb is available

Jeffrey Law jeffrey.law@oss.qualcomm.com
Sat Jun 13 04:46:54 GMT 2026



On 6/12/2026 10:56 AM, Peter Bergner wrote:
> On 6/11/26 2:51 PM, Adhemerval Zanella Netto wrote:
>> And there is another question if adding a zbb sysdep is really a good move here.
>> My understanding is chip produces and distros are moving to RVA23U64/RVA23S64,
>> which implies in zbb and thus you can select it without the need to add an
>> specific implementation.
> So there is an question here, which hopefully Adhemerval can correct me if
> I'm wrong or confirm my memory is correct.  For non-multiarch builds, it's
> the sysdeps/riscv/preconfigure fragment that detects which sysdeps/riscv/*
> subdirectory to start our subdirectory search priority with by setting the
> "machine" variable.  The Implies file in that subdirectory then points to
> the next subdirectory to search in, etc. etc.  I believe (Adhemerval correct
> me if I'm wrong), is that if preconfigure says start at subdirectory "a" and
> its Implies file points to "b" and "b"'s Implies points to "c", etc, then if
> "a" is enabled via compiler flags, that implies "b", "c", etc. are all also
> enabled via the compiler flags, correct?  Meaning if "a" is enabled, then
> it cannot be that case that any of "b", "c", etc. are disabled, correct?
>
> If that is the case, then we have a slight problem, in that rvv and zbb are
> orthogonal extensions, so one doesn't "imply" the other, so it wouldn't really
> be "legal" to have one in the Implies file of the other.
>
> However, from a practical standpoint, there are cores that have implemented zbb,
> but have not implemented rvv, but I don't know of any cores that have rvv
> without also implementing zbb, so from a purely practical standpoint, rvv
> seems to "imply" zbb.  That said, I'm not sure whether we should rely on that?
>
> It's also opposite the order we want the strlen implementation to be picked up,
> which is zbb first and then fallback to rvv.
>
> I suppose one option is if we decide that rvv does (from a practical standpoint)
> imply zbb, then we could create the zbb subdir, have it in rvv's Implies file
> and then remove the strlen-vector.S and place your strlen-zbb.S in the zbb
> subdir.  That would make all zbb only and rvv+zbb cores use the zbb strlen.
While it's probably OK in practice right now, the fundamental nature of 
the RISC-V ISA is a designer can mix and match extensions.  As you note, 
there is no implies relationship between Zbb and RVV.  I'm not at all a 
fan of how that works, but it is what it is and we should try to do the 
right thing here.

I think that argues that Adhemerval's suggestion is probably the right 
way to go.  I need to look at it again, but the gist was to move the Zbb 
stuff into the multiarch directory, dropping zbb as a distinct sysdep 
directory.  This is an aspect of glibc I don't know well at all and I 
was largely trying to mimick what's being done elsewhere.  But this is 
fundamentally different.  Adhemerval's suggestion is actually how this 
stuff was implemented internally, it was only when I looked closely at 
how the final RVV stuff went into the tree that I mirrored some of that 
into the Zbb patch.

Note that I'm still generating and evaluating data on the other cases.  
While strlen is a slam dunk right now for Zbb, the others aren't as 
clear cut.  That I think also argues that Zbb probably shouldn't be a 
sysdep.  I also would fully expect that as designs get better (let's 
face it, while K3 is a huge improvement over the K1, it's not would I 
would call a high performance design).

Jeff


More information about the Libc-alpha mailing list