2016-11-11 20:56 GMT+03:00 Uros Bizjak <ubiz...@gmail.com>:
> On Fri, Nov 11, 2016 at 6:50 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Fri, Nov 11, 2016 at 6:38 PM, Andrew Senkevich
>> <andrew.n.senkev...@gmail.com> wrote:
>>> 2016-11-11 17:34 GMT+03:00 Uros Bizjak <ubiz...@gmail.com>:
>>>> Some quick remarks:
>>>>
>>>> +(define_insn "kmovb"
>>>> +  [(set (match_operand:QI 0 "nonimmediate_operand" "=k,k")
>>>> + (unspec:QI
>>>> +  [(match_operand:QI 1 "nonimmediate_operand" "r,km")]
>>>> +  UNSPEC_KMOV))]
>>>> +  "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512DQ"
>>>> +  "@
>>>> +   kmovb\t{%k1, %0|%0, %k1}
>>>> +   kmovb\t{%1, %0|%0, %1}";
>>>> +  [(set_attr "mode" "QI")
>>>> +   (set_attr "type" "mskmov")
>>>> +   (set_attr "prefix" "vex")])
>>>> +
>>>> +(define_insn "kmovd"
>>>> +  [(set (match_operand:SI 0 "nonimmediate_operand" "=k,k")
>>>> + (unspec:SI
>>>> +  [(match_operand:SI 1 "nonimmediate_operand" "r,km")]
>>>> +  UNSPEC_KMOV))]
>>>> +  "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512BW"
>>>> +  "@
>>>> +   kmovd\t{%k1, %0|%0, %k1}
>>>> +   kmovd\t{%1, %0|%0, %1}";
>>>> +  [(set_attr "mode" "SI")
>>>> +   (set_attr "type" "mskmov")
>>>> +   (set_attr "prefix" "vex")])
>>>> +
>>>> +(define_insn "kmovq"
>>>> +  [(set (match_operand:DI 0 "nonimmediate_operand" "=k,k,km")
>>>> + (unspec:DI
>>>> +  [(match_operand:DI 1 "nonimmediate_operand" "r,km,k")]
>>>> +  UNSPEC_KMOV))]
>>>> +  "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512BW"
>>>> +  "@
>>>> +   kmovq\t{%k1, %0|%0, %k1}
>>>> +   kmovq\t{%1, %0|%0, %1}
>>>> +   kmovq\t{%1, %0|%0, %1}";
>>>> +  [(set_attr "mode" "DI")
>>>> +   (set_attr "type" "mskmov")
>>>> +   (set_attr "prefix" "vex")])
>>>>
>>>> - kmovd (and existing kmovw) should be using register_operand for
>>>> opreand 0. In this case, there is no need for MEM_P checks at all.
>>>> - In the insn constraint, pease check TARGET_AVX before checking MEM_P.
>>>> - please put these definitions above corresponding *mov??_internal 
>>>> patterns.
>>>
>>> Do you mean put below *mov??_internal patterns? Attached corrected such way.
>>
>> No, please put kmovq near *movdi_internal, kmovd near *movsi_internal,
>> etc. It doesn't matter if they are above or below their respective
>> *mov??_internal patterns, as long as they are positioned in some
>> consistent way. IOW, new patterns shouldn't be grouped together, as is
>> the case with your patch.
>
> +(define_insn "kmovb"
> +  [(set (match_operand:QI 0 "register_operand" "=k,k")
> +    (unspec:QI
> +      [(match_operand:QI 1 "nonimmediate_operand" "r,km")]
> +      UNSPEC_KMOV))]
> +  "TARGET_AVX512DQ && !MEM_P (operands[1])"
>
> There is no need for !MEM_P, this will prevent memory operand, which
> is allowed by constraint "m".
>
> +(define_insn "kmovq"
> +  [(set (match_operand:DI 0 "register_operand" "=k,k,km")
> +    (unspec:DI
> +      [(match_operand:DI 1 "nonimmediate_operand" "r,km,k")]
> +      UNSPEC_KMOV))]
> +  "TARGET_AVX512BW && !MEM_P (operands[1])"
>
> Operand 0 should have "nonimmediate_operand" predicate. And here you
> need  && !(MEM_P (op0) && MEM_P (op1)) in insn constraint to prevent
> mem->mem moves.

Changed according your comments and attached.


--
WBR,
Andrew

Attachment: add_k-mask_intrinsics_11.11_1.patch
Description: Binary data

Reply via email to