In my last commit, I had a case where the mode iterator (VSX_L, FMOVE128_GPR) used IFmode (IBM extended double) in code that was only meant for 128-bit types that fit in a single vector. In the case of VSX_L, it had a condition on the iterator, that would never be true for IFmode. But it didn't have the same protection on FMOVE128_GPR, which calls an xxperm insn to reconstruct the direct move on power8 (power8 can only move 32 or 64-bit objects directly, and it needs to construct intermediate steps to move the value). I have removed IFmode from the two iterators, and for KFmode/TFmode, added a check to make sure the type is a vector type.
Since this was breaking the build, I applied the fix directly. 2015-11-16 Michael Meissner <meiss...@linux.vnet.ibm.com> * config/rs6000/vsx.md (VSX_L): Do not include IBM extended double 128-bit types, just types that fit in a single vector. * config/rs6000/rs6000.md (FMOVE128_GPR): Likewise. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Index: gcc/config/rs6000/vsx.md =================================================================== --- gcc/config/rs6000/vsx.md (revision 230430) +++ gcc/config/rs6000/vsx.md (working copy) @@ -46,8 +46,6 @@ (define_mode_iterator VSX_DF [V2DF DF]) (define_mode_iterator VSX_F [V4SF V2DF]) ;; Iterator for logical types supported by VSX -;; Note, IFmode won't actually be used since it isn't a VSX type, but it simplifies -;; the code by using 128-bit iterators for floating point. (define_mode_iterator VSX_L [V16QI V8HI V4SI @@ -57,8 +55,7 @@ (define_mode_iterator VSX_L [V16QI V1TI TI (KF "FLOAT128_VECTOR_P (KFmode)") - (TF "FLOAT128_VECTOR_P (TFmode)") - (IF "FLOAT128_VECTOR_P (IFmode)")]) + (TF "FLOAT128_VECTOR_P (TFmode)")]) ;; Iterator for memory move. Handle TImode specially to allow ;; it to use gprs as well as vsx registers. Index: gcc/config/rs6000/rs6000.md =================================================================== --- gcc/config/rs6000/rs6000.md (revision 230430) +++ gcc/config/rs6000/rs6000.md (working copy) @@ -409,9 +409,8 @@ (define_mode_iterator FMOVE128_GPR [(TI (V2DI "") (V2DF "") (V1TI "") - (KF "") - (TF "") - (IF "")]) + (KF "FLOAT128_VECTOR_P (KFmode)") + (TF "FLOAT128_VECTOR_P (TFmode)")]) ; Iterator for 128-bit VSX types for pack/unpack (define_mode_iterator FMOVE128_VSX [V1TI KF])