[PATCH] x86-64: Add wmemset optimized with SSE2/AVX2/AVX512

H.J. Lu hjl.tools@gmail.com
Fri Jun 2 19:45:00 GMT 2017


On Wed, May 31, 2017 at 4:29 AM, Rodriguez Bahena, Victor
<victor.rodriguez.bahena@intel.com> wrote:
> +1
>
>
>
>
> -----Original Message-----
> From: <libc-alpha-owner@sourceware.org> on behalf of "H.J. Lu"
> <hjl.tools@gmail.com>
> Date: Tuesday, May 30, 2017 at 6:41 PM
> To: GNU C Library <libc-alpha@sourceware.org>
> Subject: Re: [PATCH] x86-64: Add wmemset optimized with SSE2/AVX2/AVX512
>
>>On Sun, May 21, 2017 at 1:34 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> The difference between memset and wmemset is byte vs int.  Add stubs
>>> to SSE2/AVX2/AVX512 memset for wmemset with updated constant and size:
>>>
>>> SSE2 wmemset:
>>>         shl    $0x2,%rdx
>>>         movd   %esi,%xmm0
>>>         mov    %rdi,%rax
>>>         pshufd $0x0,%xmm0,%xmm0
>>>         jmp     entry_from_wmemset
>>>
>>> SSE2 memset:
>>>         movd   %esi,%xmm0
>>>         mov    %rdi,%rax
>>>         punpcklbw %xmm0,%xmm0
>>>         punpcklwd %xmm0,%xmm0
>>>         pshufd $0x0,%xmm0,%xmm0
>>> entry_from_wmemset:
>>>
>>> Since the ERMS versions of wmemset requires "rep stosl" instead of
>>> "rep stosb", only the vector store stubs of SSE2/AVX2/AVX512 wmemset
>>> are added.  The SSE2 wmemset is about 3X faster and the AVX2 wmemset
>>> is about 6X faster on Haswell.
>>>
>>> OK for master?
>>
>>Any objections?
>>
>>> H.J.
>>> ---
>>>         * include/wchar.h (__wmemset_chk): New.
>>>         * sysdeps/x86_64/memset.S (VDUP_TO_VEC0_AND_SET_RETURN): Renamed
>>>         to MEMSET_VDUP_TO_VEC0_AND_SET_RETURN.
>>>         (WMEMSET_VDUP_TO_VEC0_AND_SET_RETURN): New.
>>>         (WMEMSET_CHK_SYMBOL): Likewise.
>>>         (WMEMSET_SYMBOL): Likewise.
>>>         (__wmemset): Add hidden definition.
>>>         (wmemset): Add weak hidden definition.
>>>         * sysdeps/x86_64/multiarch/ifunc-impl-list.c
>>>         (__libc_ifunc_impl_list): Add __wmemset_sse2_unaligned,
>>>         __wmemset_avx2_unaligned, __wmemset_avx512_unaligned,
>>>         __wmemset_chk_sse2_unaligned, __wmemset_chk_avx2_unaligned
>>>         and __wmemset_chk_avx512_unaligned.
>>>         * sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms.S
>>>         (VDUP_TO_VEC0_AND_SET_RETURN): Renamed to ...
>>>         (MEMSET_VDUP_TO_VEC0_AND_SET_RETURN): This.
>>>         (WMEMSET_VDUP_TO_VEC0_AND_SET_RETURN): New.
>>>         (WMEMSET_SYMBOL): Likewise.
>>>         * sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S
>>>         (VDUP_TO_VEC0_AND_SET_RETURN): Renamed to ...
>>>         (MEMSET_VDUP_TO_VEC0_AND_SET_RETURN): This.
>>>         (WMEMSET_VDUP_TO_VEC0_AND_SET_RETURN): New.
>>>         (WMEMSET_SYMBOL): Likewise.
>>>         * sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S: Updated.
>>>         (WMEMSET_CHK_SYMBOL): New.
>>>         (WMEMSET_CHK_SYMBOL (__wmemset_chk, unaligned)): Likewise.
>>>         (WMEMSET_SYMBOL (__wmemset, unaligned)): Likewise.
>>>         * sysdeps/x86_64/multiarch/memset.S (WMEMSET_SYMBOL): New.
>>>         (libc_hidden_builtin_def): Also define __GI_wmemset and
>>>         __GI___wmemset.
>>>         (weak_alias): New.
>>>         * sysdeps/x86_64/multiarch/wmemset.S: New file.
>>>         * sysdeps/x86_64/multiarch/wmemset_chk.S: Likewise.
>>>         * sysdeps/x86_64/wmemset.S: Likewise.
>>>         * sysdeps/x86_64/wmemset_chk.S: Likewise.

Here is the updated patch to implement IFUNC wmemset in C.


-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-x86-64-Optimize-wmemset-with-SSE2-AVX2-AVX512.patch
Type: text/x-patch
Size: 19901 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20170602/cd55e7b8/attachment.bin>


More information about the Libc-alpha mailing list