https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121375

            Bug ID: 121375
           Summary: Altivec intrinsic vec_rlmi generates incorrect code.
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: munroesj at gcc dot gnu.org
  Target Milestone: ---

When compiling for -mcpu=power9 and intrinsic vec_rlmi the generated vrlwmi
swaps the 1st/2nd operands. For example:

vui32_t
test_vec_rlmi (vui32_t a, vui32_t b, vui32_t c)
{
  vui32_t result;

#ifdef _ARCH_PWR9
#if defined (vec_rlmi)
  result = vec_rlmi (a, b, c);
#endif
#endif
  return ((vui32_t) result);
}

Would expect:
0000000000000000 <test_vec_rlmi>:
       0:       85 20 43 10     vrlwmi  v2,v3,v4
       4:       20 00 80 4e     blr

This is true for GCC versions 6-10.

But for more recent GCC versions (11-14) I see:

0000000000000000 <test_vec_rlmi>:
       0:       85 20 62 10     vrlwmi  v3,v2,v4
       4:       97 1c 43 f0     xxmr    vs34,vs35
       8:       20 00 80 4e     blr

And the results are incorrect for Vector Rotate Left then Mask-Insert
operation.

Reply via email to