# SIMD.jl/shufflevector without support for SIMD vector as mask?

**URL:** <https://discourse.julialang.org/t/simd-jl-shufflevector-without-support-for-simd-vector-as-mask/110079>\
**Category:** New to Julia\
**Tags:** simd\
**Created:** [February 11, 2024, 7:59pm UTC](https://discourse.julialang.org/t/simd-jl-shufflevector-without-support-for-simd-vector-as-mask/110079 "2024-02-11T19:59:43Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Julia2001](https://avatars.discourse-cdn.com/v4/letter/j/bc79bd/32.png) [@Julia2001](https://discourse.julialang.org/u/Julia2001)\
**Post date:** [February 11, 2024, 7:59pm UTC](https://discourse.julialang.org/t/simd-jl-shufflevector-without-support-for-simd-vector-as-mask/110079/1 "2024-02-11T19:59:43Z")

</div>

Hi!  
Could anybody explain a bit on why SIMD.jl/shufflevector does not accept a Vec{N, T} object as “mask” argument.  
Wouldn’t it be a natural choice to allow “mask” to be a SIMD vector?  
Is this an LLVM limitation?  
Is this even a common use case?

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [February 11, 2024, 8:53pm UTC](https://discourse.julialang.org/t/simd-jl-shufflevector-without-support-for-simd-vector-as-mask/110079/2 "2024-02-11T20:53:23Z")

</div>

I think this is an LLVM limitation:

[https://llvm.org/docs/LangRef.html#shufflevector-instruction](https://llvm.org/docs/LangRef.html#shufflevector-instruction)

It could probably be worked around, at the cost of no longer being architecture agnostic.

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [February 11, 2024, 9:19pm UTC](https://discourse.julialang.org/t/simd-jl-shufflevector-without-support-for-simd-vector-as-mask/110079/3 "2024-02-11T21:19:03Z")

</div>

VectorizationBase supports it, but only for CPUs with AVX512 and 8 x f64: [VectorizationBase.jl/src/special/exp.jl at cbf6789a17f3bd26bc555fc03423b877e740dee7 · JuliaSIMD/VectorizationBase.jl · GitHub](https://github.com/JuliaSIMD/VectorizationBase.jl/blob/cbf6789a17f3bd26bc555fc03423b877e740dee7/src/special/exp.jl#L158-L186)  
16 x f32 would be easy to ads following that approach.

Runtime shuffles are nice if you want to implement small-but-fast lookup tables.
