[PATCH] x86-64: Add memcmp/wmemcmp optimized with AVX2

Florian Weimer fweimer@redhat.com
Thu Jun 1 21:20:00 GMT 2017


On 06/01/2017 11:17 PM, H.J. Lu wrote:
> On Thu, Jun 1, 2017 at 2:00 PM, Florian Weimer <fweimer@redhat.com> wrote:
>> On 06/01/2017 10:57 PM, H.J. Lu wrote:
>>> I don't think it works with memcmp since return value depends on
>>> the first bytes which differs.  Say
>>>
>>> ABCDE   turns into EDCBDCBA
>>>
>>> If all bytes differs, we should only compare A, not EDCBDCBA.
>>
>> That's what the bswapq is for, it reverses the order of bytes.
>>
> 
> bswapq doesn't help since cmpq compares 8 bytes but only
> the last byte matters.   Comparing the highest byte give you the
> wrong result, like
> 
> 0x36775382d1367753
> 0x7b8d14025b7b8d14

I don't understand.  On big-endian, to compare two 8-byte arrays as if
by memcmp, you can certainly do a uint64_t load, compute the difference
as a 65-bit value, and return the integer sign of that.

The code I posted does that (modulo bugs, but you can get a working
patch from the old message I referenced).  bswapq is needed to get an
equivalent to that big-endian load.

Thanks,
Florian



More information about the Libc-alpha mailing list