[LLVMdev] More AVX Advice Needed

Bob Wilson bob.wilson at apple.com
Wed Dec 2 15:39:39 PST 2009

On Dec 2, 2009, at 3:33 PM, David Greene wrote:

> On Wednesday 02 December 2009 17:24, Eli Friedman wrote:
>> On Wed, Dec 2, 2009 at 3:08 PM, David Greene <dag at cray.com> wrote:
>>> On Wednesday 02 December 2009 16:51, Eli Friedman wrote:
>>>> On Wed, Dec 2, 2009 at 2:44 PM, David Greene <dag at cray.com> wrote:
>>>>> I'm working on some of the AVX insert/extract instructions.  They're
>>>>> stupid.  They do not operate on ymm registers, meaning we have to
>>>>> use VINSERTF128/VEXTRACTF128 and then do the real operation.
>>>>> Anyway, I'm looking at how INSERTPS and friends work and noticed that
>>>>> there are special SelectionDAG nodes for them and corresponding
>>>>> TableGen dag operators (X86insrtps, for example).
>>>>> What's the reason for using special dag operators as opposed to
>>>>> intrinsics?
>>>> INSERTPS isn't an intrinsic because there's a standard way to
>>>> represent the operation, and we try to avoid adding intrinsics when
>>>> possible.
>>> I don't get it.  How is X86insrtps "standard?"  It looks just like an
>>> intrinsic to me.
>> X86insrtps is roughly equivalent to the LLVM IR instruction
>> insertelement, so there's no need for an IR intrinsic.
>> X86ISD::INSERTPS is an extra instruction for ISel; it's used inside
>> the custom lowering for INSERT_VECTOR_ELT and VECTOR_SHUFFLE.
> Yes, that's how I found out about it.  :)
> Why not just use ISD::INSERT_VECTOR_ELT?
> And what's the difference between vector_extract and extractelt in 
> TargetSelectionDAG.td?  Ditto vector_insert vs. insertelt.

insertelt/extractelt are pickier about types.  They check that the element type is appropriate for the vector type.  It is good to use the more restrictive type constraints, but there are cases where that doesn't work (e.g., due to widening for type legalization).

More information about the llvm-dev mailing list