On 10/02/2011 10:28 PM, David Miller wrote:
>> (set (reg:DI GSR_REG)
>> (unspec:DI [(match_dup 1) (match_dup 2) (reg:DI GSR_REG)]
>> UNSPEC_BMASK))
>
> Actually, can't we just use a (zero_extend:DI (plus:SI ...)) for the
> 32-bit case? It seems to work fine.
Sure.
>>> +(define_insn "bshuffle<V64I:mode>_vis"
>>> + [(set (match_operand:V64I 0 "register_operand" "=e")
>>> + (unspec:V64I [(match_operand:V64I 1 "register_operand" "e")
>>> + (match_operand:V64I 2 "register_operand" "e")]
>>> + UNSPEC_BSHUFFLE))
>>> + (use (reg:SI GSR_REG))]
>>
>> Better to push the use of the GSR_REG into the unspec, and not leave
>> it separate in the parallel.
>
> This is actually just a non-constant vec_merge, and even though the internals
> documentation says that the 'items' operand has to be a const_int, the
> compiler
> actually doesn't care.
Um, no it isn't.
The VEC_MERGE pattern uses N bits to select N elements from op0 and op1:
op0 = A B C D
op1 = W X Y Z
bmask = 0 1 0 1 = 3
result = A X C D
Your insn doesn't use single bits for the select. It uses nibbles to
select from the 16 input bytes. It's akin to the VEC_SELECT pattern,
except that VEC_SELECT requires a constant input parallel.
---
You might have a look at the "Vector Shuffle" thread, where we've been
trying to provide builtin-level access to this feature. We've not added
an rtx-level code for this because so far there isn't *that* much in
common between the various cpus. They all seem to differ in niggling
details...
You'll have a somewhat harder time than i386 for this feature, given
that you've got to pack bytes into nibbles. But it can certainly be done.
r~