https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69143
Bug ID: 69143
Summary: PowerPC64: aggregate results are badly handled
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: anton at samba dot org
Target Milestone: ---
This testcase:
struct foo1 {
float x;
float y;
};
struct foo1 blah1(struct foo1 y)
{
struct foo1 x;
x.x = y.y;
x.y = y.x;
return x;
}
Compiled with:
gcc -fno-stack-protector -mcpu=power8 -O2
Results in the following code:
blah1:
xscvdpspn 12,2
stfs 1,-16(1)
ori 2,2,0
lwz 8,-16(1)
mfvsrd 10,12
mr 9,8
rldicl 9,9,0,32
srdi 10,10,32
sldi 10,10,32
or 9,9,10
rotldi 9,9,32
mr 10,9
srdi 9,9,32
sldi 8,10,32
sldi 10,9,32
mtvsrd 1,8
mtvsrd 2,10
xscvspdpn 1,1
xscvspdpn 2,2
blr
I was expecting a couple of FPR moves. Clang does what I expected:
blah1:
fmr 0, 1
fmr 1, 2
fmr 2, 0
blr