wmemchar for unix

monarch_dodra monarchdodra at gmail.com
Tue Aug 27 10:05:55 PDT 2013


On Tuesday, 27 August 2013 at 14:43:10 UTC, H. S. Teoh wrote:
> On Tue, Aug 27, 2013 at 07:37:02AM -0700, Sean Kelly wrote:
>> On Aug 26, 2013, at 11:57 PM, monarch_dodra 
>> <monarchdodra at gmail.com> wrote:
>> 
>> > For performance reasons, I need a "w" version of memchr.
>> > 
>> > C defines wmemchr as:
>> > wchar_t * wmemchr ( const wchar_t *, wchar_t, size_t );
>> > 
>> > Unfortunatly, on unix, "wchar_t" is defined a *4* bytes long,
>> > making wmemchr, effectivelly, "dmemchr".
>> > 
>> > Are there any "2 byte" alternatives for wmemchr on unix?
>> 
>> Why not cast the array to ushort[] and do a find()?  Or is 
>> that too
>> slow as well?
>
> Optimized searches of this kind ideally translate to the 
> various rep*
> instructions on x86. I'm not sure if dmd does that 
> optimization. If you
> really feel inclined, you could do static if (X86) and throw in 
> an asm
> block (but that would break purity, @safety, etc., so probably 
> not a
> good idea).
>
> You *might* be able to coax GDC (or LDC) to do loop unrolling 
> and/or
> substitution with rep* instructions with just plain D code, 
> though.
> Can't really say without trying it out.
>
>
> T

Hum... I think that is too complicated for what I'm trying to do. 
I don't know assembly enough. Ideally, I was hoping for a 
pre-existing C function to do the work for me :)

For now, I can settle for a simple:
version (windows)
     //use fast wmemchr
else
     //use standard code

But It feels weird, in the sense that there is no reason for 
"2byte" search to be more specific to windows than for unix...


More information about the Digitalmars-d-learn mailing list