[PATCH] aarch64: fix strcpy and strnlen for big-endian
Szabolcs Nagy
szabolcs.nagy@arm.com
Fri May 15 10:03:39 GMT 2020
The 05/15/2020 10:12, Lexi Shao wrote:
> This patch fixes the optimized implementation of strcpy and strnlen
> on a big-endian arm64 machine.
>
> The optimized method uses neon, which can process 128bit with one
> instruction. On a big-endian machine, the bit order should be reversed
> for the whole 128-bits double word. But with instuction
> rev64 datav.16b, datav.16b
> it reverses 64bits in the two halves rather than reverseing 128bits.
> There is no such instruction as rev128 to reverse the 128bits, but we
> can fix this by loading the data registers accordingly.
>
> Fixes 0237b61526e7("aarch64: Optimized implementation of strcpy") and
> 2911cb68ed3d("aarch64: Optimized implementation of strnlen").
>
> Signed-off-by: Lexi Shao <shaolexi@huawei.com>
Please add the bug reference to the title i.e.
append [BZ #25824]
note the patch was corrupted below you might want
to check if it's something on your side. (in this
case i could fix it because it was in the context)
with those fixed it's ok to commit,
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
if you don't have commit rights then i can commit
this for you.
> ---
> sysdeps/aarch64/strcpy.S | 5 +++++
> sysdeps/aarch64/strnlen.S | 5 +++++
> 2 files changed, 10 insertions(+)
>
> diff --git a/sysdeps/aarch64/strcpy.S b/sysdeps/aarch64/strcpy.S
> index 52c21c9..08859dd 100644
> --- a/sysdeps/aarch64/strcpy.S
> +++ b/sysdeps/aarch64/strcpy.S
> @@ -234,8 +234,13 @@ L(entry_no_page_cross):
> #endif
> /* ���loc */
corrupt: ^^^^^^^^^
> cmeq datav.16b, datav.16b, #0
> +#ifdef __AARCH64EB__
> + mov data1, datav.d[1]
> + mov data2, datav.d[0]
> +#else
> mov data1, datav.d[0]
> mov data2, datav.d[1]
> +#endif
> cmp data1, 0
> csel data1, data1, data2, ne
> mov pos, 8
> diff --git a/sysdeps/aarch64/strnlen.S b/sysdeps/aarch64/strnlen.S
> index 5981247..086a5c7 100644
> --- a/sysdeps/aarch64/strnlen.S
> +++ b/sysdeps/aarch64/strnlen.S
> @@ -154,8 +154,13 @@ L(loop_end):
> byte. */
>
> cmeq datav.16b, datav.16b, #0
> +#ifdef __AARCH64EB__
> + mov data1, datav.d[1]
> + mov data2, datav.d[0]
> +#else
> mov data1, datav.d[0]
> mov data2, datav.d[1]
> +#endif
> cmp data1, 0
> csel data1, data1, data2, ne
> sub len, src, srcin
> --
> 2.12.3
>
More information about the Libc-alpha
mailing list