[Bug target/88027] New: PowerPC generates slightly weird code for memset
meissner at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Nov 14 20:55:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88027
Bug ID: 88027
Summary: PowerPC generates slightly weird code for memset
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: meissner at gcc dot gnu.org
Target Milestone: ---
If the PowerPC GCC compiler is doing a memset operation to clear some aligned
memory, it will do most of the stores using vector stores, but the last quad
word will be done using GPR stores:
Consider the following code:
struct st {
vector double a[4];
};
long
bar (struct st *p)
{
__builtin_memset ((void *) p, '\0', sizeof (struct st));
return 0;
}
GCC -O3 -mcpu=power9 generates:
bar:
xxspltib 0,0 ; 0 in fpr0 (aka vsr0)
li 9,0 ; 0 in gpr9
std 9,48(3) ; store the last 2 double words as GPRs
std 9,56(3)
stxv 0,0(3) ; store the first 3 quad words as vectors
stxv 0,16(3)
stxv 0,32(3)
blr
GCC -O3 -mcpu=power8 generates:
bar:
vspltisw 0,0 ; 0 in v0 (aka vsr32)
li 9,0 ; 0 in gpr9
li 8,16 ; index for 2nd quad word
li 10,32 ; index for 3rd quad word
xxpermdi 12,32,32,2 ; word swap (should be optimized out)
std 9,48(3) ; store last doubleword -1 as GPR
stxvd2x 12,0,3 ; store first quad word as vector
stxvd2x 12,3,8 ; store second quad word as vector
std 9,56(3) ; store last double word as GPR
stxvd2x 12,3,10 ; store third quad word as vector
blr
In addition to switching between storing as GPRs and as vectors, some machines
prefer the stores to be in ascending order for better optimization.
More information about the Gcc-bugs
mailing list