Hi Segher,
on 2019/11/9 上午1:36, Segher Boessenkool wrote:
> Hi!
>
> On Fri, Nov 08, 2019 at 10:38:13AM +0800, Kewen.Lin wrote:
>>>> + [(set (match_operand:<VEC_INT> 0 "vint_operand")
>>>> + (match_operator 1 "comparison_operator"
>>>
>>> If you make an iterator for this instead, it is simpler code (you can then
>>> use <code> to do all these cases in one statement).
>>
>> If my understanding is correct and based on some tries before, I think we
>> have to leave these **CASEs** there (at least at the 1st level define_expand
>> for vec_cmp*), since vec_cmp* doesn't have <code> field in the pattern name.
>> The code can be only extracted from operator 1. I tried to add one dummy
>> operand to hold <code> but it's impractical.
>>
>> Sorry, I may miss something here, I'm happy to make a subsequent patch to
>> uniform these cases if there is a good way to run a code iterator on them.
>
> Instead of
>
> [(set (match_operand:VEC_I 0 "vint_operand")
> (match_operator 1 "signed_or_equality_comparison_operator"
> [(match_operand:VEC_I 2 "vint_operand")
> (match_operand:VEC_I 3 "vint_operand")]))]
>
> you can do
>
> [(set (match_operand:VEC_I 0 "vint_operand")
> (some_iter:VEC_I (match_operand:VEC_I 1 "vint_operand")
> (match_operand:VEC_I 2 "vint_operand")))]
>
Thanks for your example. But I'm afraid that it doesn't work for these
patterns.
I tried it with simple code below:
; For testing
(define_code_iterator some_iter [eq gt])
(define_expand "vec_cmp<mode><mode>"
[(set (match_operand:VEC_I 0 "vint_operand")
(some_iter:VEC_I
(match_operand:VEC_I 2 "vint_operand")
(match_operand:VEC_I 3 "vint_operand")))]
"VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
{
emit_insn (gen_vector_<code><mode> (operands[0], operands[2], operands[3]));
DONE;
})
Error messages were emitted:
/home/linkw/gcc/gcc-git-fix/gcc/config/rs6000/vector.md:531:1: duplicate
definition of 'vec_cmpv16qiv16qi'
/home/linkw/gcc/gcc-git-fix/gcc/config/rs6000/vector.md:531:1: duplicate
definition of 'vec_cmpv8hiv8hi'
/home/linkw/gcc/gcc-git-fix/gcc/config/rs6000/vector.md:531:1: duplicate
definition of 'vec_cmpv4siv4si'
/home/linkw/gcc/gcc-git-fix/gcc/config/rs6000/vector.md:531:1: duplicate
definition of 'vec_cmpv2div2di'
It's expected, since the pattern here is vec_cmp<mode><mode> rather than
vec_cmp<mode><mode><code>, your example would work perfectly for the later.
Btw, in that pattern, the comparison operator is passed in operand 1.
BR,
Kewen
> with some_iter some code_iterator, (note you need to renumber), and in the
> body you can then just use <code> (or <CODE>, or some other code_attribute).
>
> code_iterator is more flexible than match_operator, in most ways.
>
>
> Segher
>