mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 14:00:30 +00:00
2149da3683
The memcpy optimization (commit 587a1290a1
) has a series
of mistakes:
- The implementation is wrong: the chunk size calculation is wrong
leading to invalid memory access.
- It adds ifunc supports as default, so --disable-multi-arch does
not work as expected for riscv.
- It mixes Linux files (memcpy ifunc selection which requires the
vDSO/syscall mechanism) with generic support (the memcpy
optimization itself).
- There is no __libc_ifunc_impl_list, which makes testing only
check the selected implementation instead of all supported
by the system.
This patch also simplifies the required bits to enable ifunc: there
is no need to memcopy.h; nor to add Linux-specific files.
The __memcpy_noalignment tail handling now uses a branchless strategy
similar to aarch64 (overlap 32-bits copies for sizes 4..7 and byte
copies for size 1..3).
Checked on riscv64 and riscv32 by explicitly enabling the function
on __libc_ifunc_impl_list on qemu-system.
Changes from v1:
* Implement the memcpy in assembly to correctly handle RISCV
strict-alignment.
Reviewed-by: Evan Green <evan@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
28 lines
720 B
Makefile
28 lines
720 B
Makefile
ifeq ($(subdir),misc)
|
|
sysdep_headers += \
|
|
sys/cachectl.h \
|
|
sys/hwprobe.h \
|
|
# sysdep_headers
|
|
|
|
sysdep_routines += \
|
|
flush-icache \
|
|
hwprobe \
|
|
# sysdep_routines
|
|
|
|
endif
|
|
|
|
ifeq ($(subdir),stdlib)
|
|
gen-as-const-headers += ucontext_i.sym
|
|
endif
|
|
|
|
abi-variants := ilp32 ilp32d lp64 lp64d
|
|
|
|
ifeq (,$(filter $(default-abi),$(abi-variants)))
|
|
$(error Unknown ABI $(default-abi), must be one of $(abi-variants))
|
|
endif
|
|
|
|
abi-ilp32-condition := __WORDSIZE == 32 && defined __riscv_float_abi_soft
|
|
abi-ilp32d-condition := __WORDSIZE == 32 && defined __riscv_float_abi_double
|
|
abi-lp64-condition := __WORDSIZE == 64 && defined __riscv_float_abi_soft
|
|
abi-lp64d-condition := __WORDSIZE == 64 && defined __riscv_float_abi_double
|