]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86: Update memcpy/memset inline strategies for -mtune=generic
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 19 Mar 2021 01:43:10 +0000 (18:43 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 24 Jun 2025 05:52:28 +0000 (13:52 +0800)
commitd073bb6cfc219d4b6c283a0b527ee88b42e640e0
tree585386ac5f7977053ddfb8bce5f10fd824ecfac2
parent0235b6d41ace62064d5cd42553028136b49ad947
x86: Update memcpy/memset inline strategies for -mtune=generic

Update memcpy and memset inline strategies for -mtune=generic:

1. Don't align memory.
2. For known sizes, prefer vector loop, unroll loop with 4 moves or
   stores per iteration without aligning the loop, up to 256 bytes.
3. For unknown sizes, use memcpy/memset.
4. Since each loop iteration has 4 stores and 8 stores for zeroing with
   unroll loop may be needed, change CLEAR_RATIO to 10 so that zeroing
   up to 72 bytes are fully unrolled with 9 stores without SSE.

gcc/

PR target/70308
PR target/101366
PR target/102294
PR target/108585
PR target/118276
PR target/119596
PR target/119703
PR target/119704
* config/i386/x86-tune-costs.h (generic_memcpy): Updated.
(generic_memset): Likewise.
(generic_cost): Change CLEAR_RATIO to 10.

gcc/testsuite/

PR target/70308
PR target/101366
PR target/102294
PR target/108585
PR target/118276
PR target/119596
PR target/119703
PR target/119704
* g++.target/i386/memset-pr101366-1.C: New test.
* g++.target/i386/memset-pr101366-2.C: Likewise.
* g++.target/i386/memset-pr108585-1a.C: Likewise.
* g++.target/i386/memset-pr108585-1b.C: Likewise.
* g++.target/i386/memset-pr118276-1a.C: Likewise.
* g++.target/i386/memset-pr118276-1b.C: Likewise.
* g++.target/i386/memset-pr118276-1c.C: Likewise.
* gcc.target/i386/memcpy-strategy-12.c: Likewise.
* gcc.target/i386/memcpy-strategy-13.c: Likewise.
* gcc.target/i386/memset-pr70308-1a.c: Likewise.
* gcc.target/i386/memset-pr70308-1b.c: Likewise.
* gcc.target/i386/memset-strategy-25.c: Likewise.
* gcc.target/i386/memset-strategy-26.c: Likewise.
* gcc.target/i386/memset-strategy-27.c: Likewise.
* gcc.target/i386/memset-strategy-28.c: Likewise.
* gcc.target/i386/memset-strategy-29.c: Likewise.
* gcc.target/i386/memset-strategy-30.c: Likewise.
* gcc.target/i386/memset-strategy-31.c: Likewise.
* gcc.target/i386/auto-init-padding-3.c: Expect XMM stores.
* gcc.target/i386/auto-init-padding-9.c: Likewise.
* gcc.target/i386/mvc17.c: Fail with "rep mov"
* gcc.target/i386/pr111657-1.c: Scan for unrolled loop.  Fail
with "rep mov".
* gcc.target/i386/shrink_wrap_1.c: Also pass
-mmemset-strategy=rep_8byte:-1:align.
* gcc.target/i386/sw-1.c: Also pass -mstringop-strategy=rep_byte.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
25 files changed:
gcc/config/i386/x86-tune-costs.h
gcc/testsuite/g++.target/i386/memset-pr101366-1.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr101366-2.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr108585-1a.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr108585-1b.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr118276-1a.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr118276-1b.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/memset-pr118276-1c.C [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-3.c
gcc/testsuite/gcc.target/i386/auto-init-padding-9.c
gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-25.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-26.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-27.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-28.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-29.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-30.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/memset-strategy-31.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/mvc17.c
gcc/testsuite/gcc.target/i386/pr111657-1.c
gcc/testsuite/gcc.target/i386/shrink_wrap_1.c
gcc/testsuite/gcc.target/i386/sw-1.c