Hi, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61397 was almost resolved a year ago, but had a proposed patch by Mike Meissner that was never vetted and committed. I've reviewed the patch and tested it on GCC 5 and GCC 6, and with the patch applied we see the test pass for both 32-bit and 64-bit on a Power8 big-endian platform, as well as for 64-bit on a Power8 little-endian platform.
As I understand it, the test case got out of sync with the implementation in GCC 5, and this rewrite of the test case restores order. I've verified that the original compilation options from Andreas Schwab for this test case result in correct generation of lxsdx, which was not the case with the original report. The test case is extremely different in GCC 4.9. As Mike has noted in the PR, the -mupper-regs support does not exist in GCC 4.9, so the rewritten test case does not apply there. As stated, verified on powerpc64-unknown-linux-gnu (-m32, -m64) and powerpc64le-unknown-linux-gnu (-m64). Is this ok for trunk and GCC 5? Thanks, Bill 2016-02-26 Michael Meissner <meiss...@linux.vnet.ibm.com> Bill Schmidt <wschm...@linux.vnet.ibm.com> * gcc.target/powerpc/p8vector-ldst.c: Adjust to test desired functionality for both 32-bit and 64-bit. --- gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c (revision 220948) +++ gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c (working copy) @@ -1,4 +1,4 @@ -/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ +/* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ /* { dg-require-effective-target powerpc_p8vector_ok } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ @@ -51,13 +51,14 @@ load_store_sf (unsigned long num, float value37 = 0.0f; float value38 = 0.0f; float value39 = 0.0f; - unsigned long in_mask; - unsigned long out_mask; + unsigned long in_mask, in_mask2; + unsigned long out_mask, out_mask2; unsigned long i; for (i = 0; i < num; i++) { in_mask = *in_mask_ptr++; + in_mask2 = *in_mask_ptr++; if ((in_mask & (1L << 0)) != 0L) value00 = *from_ptr++; @@ -118,67 +119,68 @@ load_store_sf (unsigned long num, if ((in_mask & (1L << 19)) != 0L) value19 = *from_ptr++; - if ((in_mask & (1L << 20)) != 0L) + if ((in_mask2 & (1L << 0)) != 0L) value20 = *from_ptr++; - if ((in_mask & (1L << 21)) != 0L) + if ((in_mask2 & (1L << 1)) != 0L) value21 = *from_ptr++; - if ((in_mask & (1L << 22)) != 0L) + if ((in_mask2 & (1L << 2)) != 0L) value22 = *from_ptr++; - if ((in_mask & (1L << 23)) != 0L) + if ((in_mask2 & (1L << 3)) != 0L) value23 = *from_ptr++; - if ((in_mask & (1L << 24)) != 0L) + if ((in_mask2 & (1L << 4)) != 0L) value24 = *from_ptr++; - if ((in_mask & (1L << 25)) != 0L) + if ((in_mask2 & (1L << 5)) != 0L) value25 = *from_ptr++; - if ((in_mask & (1L << 26)) != 0L) + if ((in_mask2 & (1L << 6)) != 0L) value26 = *from_ptr++; - if ((in_mask & (1L << 27)) != 0L) + if ((in_mask2 & (1L << 7)) != 0L) value27 = *from_ptr++; - if ((in_mask & (1L << 28)) != 0L) + if ((in_mask2 & (1L << 8)) != 0L) value28 = *from_ptr++; - if ((in_mask & (1L << 29)) != 0L) + if ((in_mask2 & (1L << 9)) != 0L) value29 = *from_ptr++; - if ((in_mask & (1L << 30)) != 0L) + if ((in_mask2 & (1L << 10)) != 0L) value30 = *from_ptr++; - if ((in_mask & (1L << 31)) != 0L) + if ((in_mask2 & (1L << 11)) != 0L) value31 = *from_ptr++; - if ((in_mask & (1L << 32)) != 0L) + if ((in_mask2 & (1L << 12)) != 0L) value32 = *from_ptr++; - if ((in_mask & (1L << 33)) != 0L) + if ((in_mask2 & (1L << 13)) != 0L) value33 = *from_ptr++; - if ((in_mask & (1L << 34)) != 0L) + if ((in_mask2 & (1L << 14)) != 0L) value34 = *from_ptr++; - if ((in_mask & (1L << 35)) != 0L) + if ((in_mask2 & (1L << 15)) != 0L) value35 = *from_ptr++; - if ((in_mask & (1L << 36)) != 0L) + if ((in_mask2 & (1L << 16)) != 0L) value36 = *from_ptr++; - if ((in_mask & (1L << 37)) != 0L) + if ((in_mask2 & (1L << 17)) != 0L) value37 = *from_ptr++; - if ((in_mask & (1L << 38)) != 0L) + if ((in_mask2 & (1L << 18)) != 0L) value38 = *from_ptr++; - if ((in_mask & (1L << 39)) != 0L) + if ((in_mask2 & (1L << 19)) != 0L) value39 = *from_ptr++; out_mask = *out_mask_ptr++; + out_mask2 = *out_mask_ptr++; if ((out_mask & (1L << 0)) != 0L) *to_ptr++ = value00; @@ -239,64 +241,64 @@ load_store_sf (unsigned long num, if ((out_mask & (1L << 19)) != 0L) *to_ptr++ = value19; - if ((out_mask & (1L << 20)) != 0L) + if ((out_mask2 & (1L << 0)) != 0L) *to_ptr++ = value20; - if ((out_mask & (1L << 21)) != 0L) + if ((out_mask2 & (1L << 1)) != 0L) *to_ptr++ = value21; - if ((out_mask & (1L << 22)) != 0L) + if ((out_mask2 & (1L << 2)) != 0L) *to_ptr++ = value22; - if ((out_mask & (1L << 23)) != 0L) + if ((out_mask2 & (1L << 3)) != 0L) *to_ptr++ = value23; - if ((out_mask & (1L << 24)) != 0L) + if ((out_mask2 & (1L << 4)) != 0L) *to_ptr++ = value24; - if ((out_mask & (1L << 25)) != 0L) + if ((out_mask2 & (1L << 5)) != 0L) *to_ptr++ = value25; - if ((out_mask & (1L << 26)) != 0L) + if ((out_mask2 & (1L << 6)) != 0L) *to_ptr++ = value26; - if ((out_mask & (1L << 27)) != 0L) + if ((out_mask2 & (1L << 7)) != 0L) *to_ptr++ = value27; - if ((out_mask & (1L << 28)) != 0L) + if ((out_mask2 & (1L << 8)) != 0L) *to_ptr++ = value28; - if ((out_mask & (1L << 29)) != 0L) + if ((out_mask2 & (1L << 9)) != 0L) *to_ptr++ = value29; - if ((out_mask & (1L << 30)) != 0L) + if ((out_mask2 & (1L << 10)) != 0L) *to_ptr++ = value30; - if ((out_mask & (1L << 31)) != 0L) + if ((out_mask2 & (1L << 11)) != 0L) *to_ptr++ = value31; - if ((out_mask & (1L << 32)) != 0L) + if ((out_mask2 & (1L << 12)) != 0L) *to_ptr++ = value32; - if ((out_mask & (1L << 33)) != 0L) + if ((out_mask2 & (1L << 13)) != 0L) *to_ptr++ = value33; - if ((out_mask & (1L << 34)) != 0L) + if ((out_mask2 & (1L << 14)) != 0L) *to_ptr++ = value34; - if ((out_mask & (1L << 35)) != 0L) + if ((out_mask2 & (1L << 15)) != 0L) *to_ptr++ = value35; - if ((out_mask & (1L << 36)) != 0L) + if ((out_mask2 & (1L << 16)) != 0L) *to_ptr++ = value36; - if ((out_mask & (1L << 37)) != 0L) + if ((out_mask2 & (1L << 17)) != 0L) *to_ptr++ = value37; - if ((out_mask & (1L << 38)) != 0L) + if ((out_mask2 & (1L << 18)) != 0L) *to_ptr++ = value38; - if ((out_mask & (1L << 39)) != 0L) + if ((out_mask2 & (1L << 19)) != 0L) *to_ptr++ = value39; } @@ -357,13 +359,14 @@ load_store_df (unsigned long num, double value37 = 0.0; double value38 = 0.0; double value39 = 0.0; - unsigned long in_mask; - unsigned long out_mask; + unsigned long in_mask, in_mask2; + unsigned long out_mask, out_mask2; unsigned long i; for (i = 0; i < num; i++) { in_mask = *in_mask_ptr++; + in_mask2 = *in_mask_ptr++; if ((in_mask & (1L << 0)) != 0L) value00 = *from_ptr++; @@ -424,67 +427,68 @@ load_store_df (unsigned long num, if ((in_mask & (1L << 19)) != 0L) value19 = *from_ptr++; - if ((in_mask & (1L << 20)) != 0L) + if ((in_mask2 & (1L << 0)) != 0L) value20 = *from_ptr++; - if ((in_mask & (1L << 21)) != 0L) + if ((in_mask2 & (1L << 1)) != 0L) value21 = *from_ptr++; - if ((in_mask & (1L << 22)) != 0L) + if ((in_mask2 & (1L << 2)) != 0L) value22 = *from_ptr++; - if ((in_mask & (1L << 23)) != 0L) + if ((in_mask2 & (1L << 3)) != 0L) value23 = *from_ptr++; - if ((in_mask & (1L << 24)) != 0L) + if ((in_mask2 & (1L << 4)) != 0L) value24 = *from_ptr++; - if ((in_mask & (1L << 25)) != 0L) + if ((in_mask2 & (1L << 5)) != 0L) value25 = *from_ptr++; - if ((in_mask & (1L << 26)) != 0L) + if ((in_mask2 & (1L << 6)) != 0L) value26 = *from_ptr++; - if ((in_mask & (1L << 27)) != 0L) + if ((in_mask2 & (1L << 7)) != 0L) value27 = *from_ptr++; - if ((in_mask & (1L << 28)) != 0L) + if ((in_mask2 & (1L << 8)) != 0L) value28 = *from_ptr++; - if ((in_mask & (1L << 29)) != 0L) + if ((in_mask2 & (1L << 9)) != 0L) value29 = *from_ptr++; - if ((in_mask & (1L << 30)) != 0L) + if ((in_mask2 & (1L << 10)) != 0L) value30 = *from_ptr++; - if ((in_mask & (1L << 31)) != 0L) + if ((in_mask2 & (1L << 11)) != 0L) value31 = *from_ptr++; - if ((in_mask & (1L << 32)) != 0L) + if ((in_mask2 & (1L << 12)) != 0L) value32 = *from_ptr++; - if ((in_mask & (1L << 33)) != 0L) + if ((in_mask2 & (1L << 13)) != 0L) value33 = *from_ptr++; - if ((in_mask & (1L << 34)) != 0L) + if ((in_mask2 & (1L << 14)) != 0L) value34 = *from_ptr++; - if ((in_mask & (1L << 35)) != 0L) + if ((in_mask2 & (1L << 15)) != 0L) value35 = *from_ptr++; - if ((in_mask & (1L << 36)) != 0L) + if ((in_mask2 & (1L << 16)) != 0L) value36 = *from_ptr++; - if ((in_mask & (1L << 37)) != 0L) + if ((in_mask2 & (1L << 17)) != 0L) value37 = *from_ptr++; - if ((in_mask & (1L << 38)) != 0L) + if ((in_mask2 & (1L << 18)) != 0L) value38 = *from_ptr++; - if ((in_mask & (1L << 39)) != 0L) + if ((in_mask2 & (1L << 19)) != 0L) value39 = *from_ptr++; out_mask = *out_mask_ptr++; + out_mask2 = *out_mask_ptr++; if ((out_mask & (1L << 0)) != 0L) *to_ptr++ = value00; @@ -545,64 +549,64 @@ load_store_df (unsigned long num, if ((out_mask & (1L << 19)) != 0L) *to_ptr++ = value19; - if ((out_mask & (1L << 20)) != 0L) + if ((out_mask2 & (1L << 0)) != 0L) *to_ptr++ = value20; - if ((out_mask & (1L << 21)) != 0L) + if ((out_mask2 & (1L << 1)) != 0L) *to_ptr++ = value21; - if ((out_mask & (1L << 22)) != 0L) + if ((out_mask2 & (1L << 2)) != 0L) *to_ptr++ = value22; - if ((out_mask & (1L << 23)) != 0L) + if ((out_mask2 & (1L << 3)) != 0L) *to_ptr++ = value23; - if ((out_mask & (1L << 24)) != 0L) + if ((out_mask2 & (1L << 4)) != 0L) *to_ptr++ = value24; - if ((out_mask & (1L << 25)) != 0L) + if ((out_mask2 & (1L << 5)) != 0L) *to_ptr++ = value25; - if ((out_mask & (1L << 26)) != 0L) + if ((out_mask2 & (1L << 6)) != 0L) *to_ptr++ = value26; - if ((out_mask & (1L << 27)) != 0L) + if ((out_mask2 & (1L << 7)) != 0L) *to_ptr++ = value27; - if ((out_mask & (1L << 28)) != 0L) + if ((out_mask2 & (1L << 8)) != 0L) *to_ptr++ = value28; - if ((out_mask & (1L << 29)) != 0L) + if ((out_mask2 & (1L << 9)) != 0L) *to_ptr++ = value29; - if ((out_mask & (1L << 30)) != 0L) + if ((out_mask2 & (1L << 10)) != 0L) *to_ptr++ = value30; - if ((out_mask & (1L << 31)) != 0L) + if ((out_mask2 & (1L << 11)) != 0L) *to_ptr++ = value31; - if ((out_mask & (1L << 32)) != 0L) + if ((out_mask2 & (1L << 12)) != 0L) *to_ptr++ = value32; - if ((out_mask & (1L << 33)) != 0L) + if ((out_mask2 & (1L << 13)) != 0L) *to_ptr++ = value33; - if ((out_mask & (1L << 34)) != 0L) + if ((out_mask2 & (1L << 14)) != 0L) *to_ptr++ = value34; - if ((out_mask & (1L << 35)) != 0L) + if ((out_mask2 & (1L << 15)) != 0L) *to_ptr++ = value35; - if ((out_mask & (1L << 36)) != 0L) + if ((out_mask2 & (1L << 16)) != 0L) *to_ptr++ = value36; - if ((out_mask & (1L << 37)) != 0L) + if ((out_mask2 & (1L << 17)) != 0L) *to_ptr++ = value37; - if ((out_mask & (1L << 38)) != 0L) + if ((out_mask2 & (1L << 18)) != 0L) *to_ptr++ = value38; - if ((out_mask & (1L << 39)) != 0L) + if ((out_mask2 & (1L << 19)) != 0L) *to_ptr++ = value39; }