blob: 12b48c0b91e3fba2c28a4b5bd907175f03a5e963 [file] [log] [blame]
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mdejagnu-cpu=power8 -O3" } */
/* Verify that swap optimization properly removes swaps for unaligned
vector stores. See PR65456. */
typedef unsigned char UChar;
typedef unsigned short UShort;
typedef unsigned int UWord;
typedef unsigned long SizeT;
typedef unsigned long Addr;
void *memmove(void *dst, const void *src, SizeT len)
{
const Addr WS = sizeof(UWord);/* 8 or 4 */
const Addr WM = WS - 1;/* 7 or 3 */
/* Copying backwards. */
SizeT n = len;
Addr d = (Addr) dst;
Addr s = (Addr) src;
if (((s ^ d) & WM) == 0) {
/* s and d have same UWord alignment. */
/* Pull up to a UWord boundary. */
while ((s & WM) != 0 && n >= 1) {
*(UChar *) d = *(UChar *) s;
s += 1;
d += 1;
n -= 1;
}
/* Copy UWords. */
while (n >= WS) {
*(UWord *) d = *(UWord *) s;
s += WS;
d += WS;
n -= WS;
}
if (n == 0)
return dst;
}
if (((s | d) & 1) == 0) {
/* Both are 16-aligned; copy what we can thusly. */
while (n >= 2) {
*(UShort *) d = *(UShort *) s;
s += 2;
d += 2;
n -= 2;
}
}
/* Copy leftovers, or everything if misaligned. */
while (n >= 1) {
*(UChar *) d = *(UChar *) s;
s += 1;
d += 1;
n -= 1;
}
return dst;
}
/* { dg-final { scan-assembler-not "xxpermdi" } } */
/* { dg-final { scan-assembler-not "xxswapd" } } */