]> granicus.if.org Git - clang/commit
[PPC64LE] Implement little-endian semantics for vec_perm
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Thu, 5 Jun 2014 19:07:40 +0000 (19:07 +0000)
committerBill Schmidt <wschmidt@linux.vnet.ibm.com>
Thu, 5 Jun 2014 19:07:40 +0000 (19:07 +0000)
commit9d30c0295ed8a2b8ac81ec380eea6b6bdaacb5c7
treee075358e0778f9a9cc191946c8b4f676ee422ee4
parentf83e80c885197148fd5df28cc9c04053dd66f361
[PPC64LE] Implement little-endian semantics for vec_perm

The PowerPC vperm (vector permute) instruction is defined
architecturally with a big-endian bias, in that the two input vectors
are assumed to be concatenated "left to right" and the elements of the
combined input vector are assumed to be numbered from "left to right"
(i.e., with element 0 referencing the high-order element).  This
definition is unnatural for little-endian code generation.

To facilitate ease of porting, the vec_perm interface is designed to
use natural element ordering, so that elements are numbered according
to little-endian design principles when code is generated for a
little-endian target.  The desired semantics can be achieved with the
vperm instruction provided that the two input vector registers are
reversed, and the permute control vector is complemented.  The
complementing is performed using an xor with a vector containing all
one bits.

Only the rightmost 5 bits of each element of the permute control
vector are relevant, so it would be possible to complement the vector
with respect to a <16xi8> vector containing all 31s.  However, when
the permute control vector is not a constant, using 255 instead has
the advantage that the vec_xor can be recognized during code
generation as a vnor instruction.  (Power8 introduces a vnand
instruction which could alternatively be generated.)

The correctness of this code is tested by the new perm.c test added in
a previous patch.  I plan to later make the existing ppc32 Altivec
compile-time tests work for ppc64 and ppc64le as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210279 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Headers/altivec.h