.. Copyright (c) 2016, Johan Mabille, Sylvain Corlay 

   Distributed under the terms of the BSD 3-Clause License.

   The full license is in the file LICENSE, distributed with this software.

.. _Data Transfer:

Data Transfers
==============

From memory:

+---------------------------------------+----------------------------------------------------+
| :cpp:func:`load`                      | load values from memory (optionally masked)        |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`load_aligned`              | load values from aligned memory                    |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`load_unaligned`            | load values from unaligned memory                  |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`load_as`                   | load values, forcing a type conversion             |
+---------------------------------------+----------------------------------------------------+

From a scalar:

+---------------------------------------+----------------------------------------------------+
| :cpp:func:`broadcast`                 | broadcasting a value to all slots                  |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`broadcast_as`              | broadcasting a value, forcing a type conversion    |
+---------------------------------------+----------------------------------------------------+

To memory:

+---------------------------------------+----------------------------------------------------+
| :cpp:func:`store`                     | store values to memory (optionally masked)         |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`store_aligned`             | store values to aligned memory                     |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`store_unaligned`           | store values to unaligned memory                   |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`store_as`                  | store values, forcing a type conversion            |
+---------------------------------------+----------------------------------------------------+

In place:

+---------------------------------------+----------------------------------------------------+
| :cpp:func:`swizzle`                   | rearrange slots within the batch                   |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`slide_left`                | bitwise shift the whole batch to the left          |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`slide_right`               | bitwise shift the whole batch to the right         |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`rotate_left`               | bitwise rotate the whole batch to the left         |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`rotate_right`              | bitwise rotate the whole batch to the right        |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`insert`                    | modify a single batch slot                         |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`compress`                  | pack elements according to a mask                  |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`expand`                    | select contiguous elements from the batch          |
+---------------------------------------+----------------------------------------------------+

Between batches:

+---------------------------------------+----------------------------------------------------+
| :cpp:func:`transpose`                 | tranpose a matrix as an array of batches           |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`zip_lo`                    | interleave low halves of two batches               |
+---------------------------------------+----------------------------------------------------+
| :cpp:func:`zip_hi`                    | interleave high halves of two batches              |
+---------------------------------------+----------------------------------------------------+

----

.. doxygengroup:: batch_data_transfer
   :project: xsimd
   :content-only:

The following empty types are used for tag dispatching:

.. doxygenstruct:: xsimd::aligned_mode
   :project: xsimd

.. doxygenstruct:: xsimd::unaligned_mode
   :project: xsimd
