This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2] aarch64: thunderx2 memcpy branches reordering
- From: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>
- To: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, "anton dot youdkevitch at bell-sw dot com" <anton dot youdkevitch at bell-sw dot com>
- Cc: nd <nd at arm dot com>
- Date: Fri, 22 Mar 2019 16:18:19 +0000
- Subject: Re: [PATCH v2] aarch64: thunderx2 memcpy branches reordering
Hi Anton,
> Rewrote the branches in load and merge chunk
> so that the order is more in line with the
> most probable case.
Why not make the code more efficient as well? The loop has 2 redundant
moves and the code for each alignment is twice as large as it could be.
It's not a large amount of effort to do better, see below.
@@ -557,17 +558,9 @@ L(ext_size_ ## shft):;\
ext A_v.16b, C_v.16b, D_v.16b, 16-shft;\
ext B_v.16b, D_v.16b, E_v.16b, 16-shft;\
These instructions are already part of the main loop, so why not directly
branch into it rather than repeat them?
subs count, count, 32;\
- b.ge 2f;\
+ b.lt 2f;\
This branch is completely redundant since count is always larger than 32.
1:;\
stp A_q, B_q, [dst], #32;\
- ext H_v.16b, E_v.16b, F_v.16b, 16-shft;\
- ext I_v.16b, F_v.16b, G_v.16b, 16-shft;\
- stp H_q, I_q, [dst], #16;\
- add dst, dst, tmp1;\
- str G_q, [dst], #16;\
- b L(copy_long_check32);\
-2:;\
- stp A_q, B_q, [dst], #32;\
prfm pldl1strm, [src, MEMCPY_PREFETCH_LDR];\
ldp D_q, J_q, [src], #32;\
ext H_v.16b, E_v.16b, F_v.16b, 16-shft;\
@@ -579,8 +572,15 @@ L(ext_size_ ## shft):;\
ext B_v.16b, D_v.16b, J_v.16b, 16-shft;\
mov E_v.16b, J_v.16b;\
Redundant move in loop (2x). You might as well execute the next ext!
subs count, count, 64;\
- b.ge 2b;\
- b 1b;\
+ b.ge 1b;\
+2:;\
+ stp A_q, B_q, [dst], #32;\
+ ext H_v.16b, E_v.16b, F_v.16b, 16-shft;\
+ ext I_v.16b, F_v.16b, G_v.16b, 16-shft;\
These instructions appear in the loop already, why not break out of
the loop after executing them?
+ stp H_q, I_q, [dst], #16;\
+ add dst, dst, tmp1;\
+ str G_q, [dst], #16;\
+ b L(copy_long_check32);\
These instructions are invariant with respect to alignment, so why repeat
these many times?
Wilco