https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106770
--- Comment #6 from Jens Seifert <jens.seifert at de dot ibm.com> --- The left part of VSX registers overlaps with floating point registers, that is why no register xxpermdi is required and mfvsrd can access all (left) parts of VSX registers directly. The xxpermdi x,y,y,3 indicates to me that gcc prefers right part of register which might also cause the xxpermdi at the beginning. At the end the mystery is why gcc adds 3 xxpermdi to the code.