On Thu, Apr 21, 2016 at 6:48 AM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Thu, Apr 21, 2016 at 3:43 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Thu, Apr 21, 2016 at 6:33 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >>> On Thu, Apr 21, 2016 at 2:59 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> >>>>> We know, that const_int (-1) is allowed with TARGET_SSE2 and that >>>>> const_wide_int (-1) is allowed with TARGET_AVX2. Probably we don't >>>>> have to check AVX512F in standard_sse_constant_p, as it implies >>>>> TARGET_AVX2. >>>>> >>>>> As said, it is the job of insn mode attributes to emit correct >>>>> instruction. >>>>> >>>>> Based on the above observations, mode checks for -1 are not needed in >>>>> standard_sse_constant_p. >>>> >>>> void >>>> ix86_expand_vector_move (machine_mode mode, rtx operands[]) >>>> { >>>> rtx op0 = operands[0], op1 = operands[1]; >>>> /* Use GET_MODE_BITSIZE instead of GET_MODE_ALIGNMENT for IA MCU >>>> psABI since the biggest alignment is 4 byte for IA MCU psABI. */ >>>> unsigned int align = (TARGET_IAMCU >>>> ? GET_MODE_BITSIZE (mode) >>>> : GET_MODE_ALIGNMENT (mode)); >>>> >>>> if (push_operand (op0, VOIDmode)) >>>> op0 = emit_move_resolve_push (mode, op0); >>>> >>>> /* Force constants other than zero into memory. We do not know how >>>> the instructions used to build constants modify the upper 64 bits >>>> of the register, once we have that information we may be able >>>> to handle some of them more efficiently. */ >>>> if (can_create_pseudo_p () >>>> && register_operand (op0, mode) >>>> && (CONSTANT_P (op1) >>>> || (SUBREG_P (op1) >>>> && CONSTANT_P (SUBREG_REG (op1)))) >>>> && !standard_sse_constant_p (op1)) >>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>>> >>>> What should it return for op1 == (VOIDmode) -1 when >>>> TARGET_AVX is true and TARGET_AVX2 is false for >>>> mode == TImode and mode == OImode? >>>> >>>> op1 = validize_mem (force_const_mem (mode, op1)); >>> >>> Let me rethink and redesign this whole mess, so we will have >>> consistent predicates. >> >> The problem is because -1 has no mode. We can't tell >> if -1 is a valid SSE constant without mode. That is my >> change to standard_sse_constant_p and >> ix86_expand_vector_move is for. It is sufficient for >> all my tests, including benchmark runs. > > I'm not against mode checks, but IMO, we have to do these checks in > predicates, where we know operand mode.
I tried and it doesn't work since the correct mode may not be always available in predicates. Yes, they pass mode. But they just do mode = GET_MODE (op); which returns VOIDmode for -1. -- H.J.