[Bug middle-end/90323] powerpc should convert equivalent sequences to vec_sel()
luoxhu at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Apr 8 05:25:01 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90323
luoxhu at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |luoxhu at gcc dot gnu.org
--- Comment #8 from luoxhu at gcc dot gnu.org ---
Two minor updates for the case mentioned in #c2:
for VEC_SEL (ARG1, ARG2, ARG3):
Returns a vector containing the value of either ARG1 or ARG2 depending on
the
value of ARG3.
#include <stdio.h>
#include <altivec.h>
volatile vector unsigned orig = {0xebebebeb, 0x34343434, 0x76767676,
0x12121212};
volatile vector unsigned mask = {0xffffffff, 0, 0xffffffff, 0};
volatile vector unsigned fill = {0xfefefefe, 0xaaaaaaaa, 0xbbbbbbbb,
0xcccccccc};
volatile vector unsigned expected = {0xfefefefe, 0x34343434, 0xbbbbbbbb,
0x12121212};
__attribute__ ((noinline))
vector unsigned without_sel(vector unsigned l, vector unsigned r, vector
unsigned mask) {
- l = l & ~r;
+ l = l & ~mask;
l |= mask & r;
return l;
}
__attribute__ ((noinline))
vector unsigned with_sel(vector unsigned l, vector unsigned r, vector unsigned
mask) {
- return vec_sel(l, mask, r);
+ return vec_sel(l, r, mask);
}
int main() {
vector unsigned res1 = without_sel(orig, fill, mask);
vector unsigned res2 = with_sel(orig, fill, mask);
if (!vec_all_eq(res1, expected)) printf ("error1\n");
if (!vec_all_eq(res2, expected)) printf ("error2\n");
return 0;
}
And the ASM would be:
without_sel:
xxlxor 35,34,35
xxland 35,35,36
xxlxor 34,34,35
blr
.long 0
.byte 0,0,0,0,0,0,0,0
with_sel:
xxsel 34,34,35,36
blr
.long 0
.byte 0,0,0,0,0,0,0,0
More information about the Gcc-bugs
mailing list