On Mon, Apr 25, 2016 at 9:45 PM, Richard Sandiford
<[email protected]> wrote:
>>> Can you please investigate, what is wrong with all_ones_operand so it
>>> doesn't accept all (-1) operands?
>>
>> Does following work:
>>
>> ;; Return true if operand is a (vector) constant with all bits set.
>> (define_predicate "all_ones_operand"
>> (match_code "const_int,const_wide_int,const_vector")
>> {
>> if (op == constm1_rtx)
>> return true;
>>
>> if (CONST_INT_P (op))
>> return INTVAL (op) == HOST_WIDE_INT_M1;
>>
>> if (mode == VOIDmode)
>> mode = GET_MODE (op);
>> return op == CONSTM1_RTX (mode);
>> })
>
> const_wide_int isn't necessary here. An all-1s integer will always
> use CONST_INT, regardless of the mode size.
>
> I think this reduces to:
>
> (define_predicate "all_ones_operand"
> (match_code "const_int,const_vector")
> {
> if (CONST_INT_P (op))
> return INTVAL (op) == HOST_WIDE_INT_M1;
> return op == CONSTM1_RTX (GET_MODE (op));
> }
>
> (which is still more complex than it should be -- roll on CONST_INTs
> with modes. :-))
This is now implemented in a different way, but nevertheless some
const_wide_int codes were removed from other predicates in a follow-up
patch.
Uros.