On 07/03/2014 02:53 AM, Evgeny Stupachenko wrote: > -expand_vec_perm_palignr (struct expand_vec_perm_d *d) > +expand_vec_perm_palignr (struct expand_vec_perm_d *d, int insn_num)
insn_num might as well be "bool avx2", since it's only ever set to two values. > - /* Even with AVX, palignr only operates on 128-bit vectors. */ > - if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16) > + /* SSSE3 is required to apply PALIGNR on 16 bytes operands. */ > + if (GET_MODE_SIZE (d->vmode) == 16) > + { > + if (!TARGET_SSSE3) > + return false; > + } > + /* AVX2 is required to apply PALIGNR on 32 bytes operands. */ > + else if (GET_MODE_SIZE (d->vmode) == 32) > + { > + if (!TARGET_AVX2) > + return false; > + } > + /* Other sizes are not supported. */ > + else > return false; And you'd better check it up here because... > + /* For SSSE3 we need 1 instruction for palignr plus 1 for one > + operand permutaoin. */ > + if (insn_num == 2) > + { > + ok = expand_vec_perm_1 (&dcopy); > + gcc_assert (ok); > + } > + /* For AVX2 we need 2 instructions for the shift: vpalignr and > + vperm plus 4 instructions for one operand permutation. */ > + else if (insn_num == 6) > + { > + ok = expand_vec_perm_vpshufb2_vpermq (&dcopy); > + gcc_assert (ok); > + } > + else > + ok = false; > return ok; ... down here you'll simply ICE from the gcc_assert. r~