.. _stdlib-simd-types:

****************
 SIMD Support
****************

Type ``VecElement{T}`` is intended for building libraries of SIMD operations.
Practical use of it requires using ``llvmcall``. The type is defined as::

    immutable VecElement{T}
        value::T
    end

It has a special compilation rule: a homogeneous tuple of ``VecElement{T}``
maps to an LLVM ``vector`` type when ``T`` is a bitstype and the tuple
length is in the set {2-6,8-10,16}.

At ``-O3``, the compiler *might* automatically vectorize operations
on such tuples. For example, the following program, when compiled
with ``julia -O3`` generates two SIMD addition instructions (``addps``)
on x86 systems::

    typealias m128 NTuple{4,VecElement{Float32}}

    function add(a::m128, b::m128)
        (VecElement(a[1].value+b[1].value),
         VecElement(a[2].value+b[2].value),
         VecElement(a[3].value+b[3].value),
         VecElement(a[4].value+b[4].value))
    end

    triple(c::m128) = add(add(c,c),c)

    code_native(triple,(m128,))

However, since the automatic vectorization cannot be relied upon,
future use will mostly be via libraries that use ``llvmcall``.
