/*! @header
 *  This header defines functions for constructing, extending, and truncating
 *  simd vector types.
 *
 *  For each vector type `simd_typeN` supported by <simd/simd.h>, the following
 *  constructors are provided:
 *
 *  ~~~
 *  simd_typeN simd_make_typeN(type other);
 *  simd_typeN simd_make_typeN(simd_typeM other);
 *  ~~~
 *  For the scalar-input version, or if M < N, these functions zero-extend
 *  `other` to produce a wider vector. If M == N, `other` is passed through
 *  unmodified. If `M > N`, `other` is truncated to form the result.
 *
 *  ~~~
 *  simd_typeN simd_make_typeN_undef(type other);
 *  simd_typeN simd_make_typeN_undef(simd_typeM other);
 *  ~~~
 *  These functions are only available for M < N and for scalar inputs. They 
 *  extend `other` to produce a wider vector where the contents of the newly-
 *  formed lanes are undefined.
 *
 *  In addition, if N is 2, 3, or 4, the following constructors are available:
 *  ~~~
 *  simd_make_typeN(parts ...)
 *  ~~~
 *  where parts is a list of scalars and smaller vectors such that the sum of
 *  the number of lanes in the arguments is equal to N. For example, a
 *  `simd_float3` can be constructed from three `floats`, or a `float` and a
 *  `simd_float2` in any order:
 *  ~~~
 *  simd_float2 ab = { 1, 2 };
 *  simd_float3 vector = simd_make_float3(ab, 3);
 *  ~~~
 *
 *  In C++ the above functions are templated in the simd:: namespace.
 *
 *      C++ Function                            Equivalent C Function
 *      -------------------------------------------------------------------
 *      simd::make<simd::typeN>(x ...)          simd_make_typeN(x ...)
 *      simd::make_undef<simd::typeN>(x ...)    simd_make_typeN_undef(x ...)
 *
 *
 *  In addition, templated Vector<ScalarType, count> struct is available for
 *  templated code based on the scalar type.
 *
 *      template <typename ScalarType, size_t count> struct simd::Vector {
 *        //  static const size_t count
 *        //  typedef scalar_t
 *        //  typedef type
 *        //  typedef packed_t
 *      };
 *
 *  Lookup the equivalent Vector struct according to typeN:
 *      template <typename typeN> struct simd::get_traits
 *      {
 *      //    using type = Vector<ScalarType, count>;
 *      };
 *
 *  This is commonly used to get the type traits of typeN, so a helper type,
 *  namely traits, is available to query the type traits easily.
 *      simd::traits<typeN>::count
 *      simd::traits<typeN>::scalar_t
 *
 *  @copyright 2014-2016 Apple, Inc. All rights reserved.
 *  @unsorted                                                                 */

#ifndef SIMD_VECTOR_CONSTRUCTORS
#define SIMD_VECTOR_CONSTRUCTORS

#include <simd/vector_types.h>
#if SIMD_COMPILER_HAS_REQUIRED_FEATURES

#ifdef __cplusplus
extern "C" {
#endif

/*! @abstract Concatenates `x` and `y` to form a vector of two 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char2 simd_make_char2(char x, char y) {
  simd_char2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char2 simd_make_char2(char other) {
  simd_char2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char2 simd_make_char2_undef(char other) {
  simd_char2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char16 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char32 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char2 simd_make_char2(simd_char64 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char3 simd_make_char3(char x, char y, char z) {
  simd_char3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char3 simd_make_char3(char x, simd_char2 yz) {
  simd_char3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char2 xy, char z) {
  simd_char3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(char other) {
  simd_char3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char3 simd_make_char3_undef(char other) {
  simd_char3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char2 other) {
  simd_char3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char3 simd_make_char3_undef(simd_char2 other) {
  simd_char3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char16 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char32 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char3 simd_make_char3(simd_char64 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CFUNC simd_char4 simd_make_char4(char x, char y, char z, char w) {
  simd_char4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(char x, char y, simd_char2 zw) {
  simd_char4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(char x, simd_char2 yz, char w) {
  simd_char4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char2 xy, char z, char w) {
  simd_char4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(char x, simd_char3 yzw) {
  simd_char4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char2 xy, simd_char2 zw) {
  simd_char4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char3 xyz, char w) {
  simd_char4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char4 simd_make_char4(char other) {
  simd_char4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char4 simd_make_char4_undef(char other) {
  simd_char4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char2 other) {
  simd_char4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char4 simd_make_char4_undef(simd_char2 other) {
  simd_char4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char3 other) {
  simd_char4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char4 simd_make_char4_undef(simd_char3 other) {
  simd_char4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char16 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char32 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_char4 simd_make_char4(simd_char64 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char4 lo, simd_char4 hi) {
  simd_char8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(char other) {
  simd_char8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char8 simd_make_char8_undef(char other) {
  simd_char8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char2 other) {
  simd_char8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char8 simd_make_char8_undef(simd_char2 other) {
  simd_char8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char3 other) {
  simd_char8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char8 simd_make_char8_undef(simd_char3 other) {
  simd_char8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char4 other) {
  simd_char8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_char8 simd_make_char8_undef(simd_char4 other) {
  simd_char8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char16 other) {
  return simd_make_char8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char32 other) {
  return simd_make_char8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char8 simd_make_char8(simd_char64 other) {
  return simd_make_char8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char8 lo, simd_char8 hi) {
  simd_char16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(char other) {
  simd_char16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char16 simd_make_char16_undef(char other) {
  simd_char16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char2 other) {
  simd_char16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char16 simd_make_char16_undef(simd_char2 other) {
  simd_char16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char3 other) {
  simd_char16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char16 simd_make_char16_undef(simd_char3 other) {
  simd_char16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char4 other) {
  simd_char16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char16 simd_make_char16_undef(simd_char4 other) {
  simd_char16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char8 other) {
  simd_char16 result = 0;
  result.lo = simd_make_char8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char16 simd_make_char16_undef(simd_char8 other) {
  simd_char16 result;
  result.lo = simd_make_char8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char16 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char32 other) {
  return simd_make_char16(other.lo);
}

/*! @abstract Truncates `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char16 simd_make_char16(simd_char64 other) {
  return simd_make_char16(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char16 lo, simd_char16 hi) {
  simd_char32 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(char other) {
  simd_char32 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(char other) {
  simd_char32 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char2 other) {
  simd_char32 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(simd_char2 other) {
  simd_char32 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char3 other) {
  simd_char32 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(simd_char3 other) {
  simd_char32 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char4 other) {
  simd_char32 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(simd_char4 other) {
  simd_char32 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char8 other) {
  simd_char32 result = 0;
  result.lo = simd_make_char16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(simd_char8 other) {
  simd_char32 result;
  result.lo = simd_make_char16(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char16 other) {
  simd_char32 result = 0;
  result.lo = simd_make_char16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char32 simd_make_char32_undef(simd_char16 other) {
  simd_char32 result;
  result.lo = simd_make_char16(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char32 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_char32 simd_make_char32(simd_char64 other) {
  return simd_make_char32(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixty-four
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char32 lo, simd_char32 hi) {
  simd_char64 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(char other) {
  simd_char64 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(char other) {
  simd_char64 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char2 other) {
  simd_char64 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char2 other) {
  simd_char64 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char3 other) {
  simd_char64 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char3 other) {
  simd_char64 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char4 other) {
  simd_char64 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char4 other) {
  simd_char64 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char8 other) {
  simd_char64 result = 0;
  result.lo = simd_make_char32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char8 other) {
  simd_char64 result;
  result.lo = simd_make_char32(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char16 other) {
  simd_char64 result = 0;
  result.lo = simd_make_char32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char16 other) {
  simd_char64 result;
  result.lo = simd_make_char32(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char32 other) {
  simd_char64 result = 0;
  result.lo = simd_make_char32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_char64 simd_make_char64_undef(simd_char32 other) {
  simd_char64 result;
  result.lo = simd_make_char32(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_char64 simd_make_char64(simd_char64 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(unsigned char x, unsigned char y) {
  simd_uchar2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(unsigned char other) {
  simd_uchar2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2_undef(unsigned char other) {
  simd_uchar2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar16 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar32 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar2 simd_make_uchar2(simd_uchar64 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(unsigned char x, unsigned char y, unsigned char z) {
  simd_uchar3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(unsigned char x, simd_uchar2 yz) {
  simd_uchar3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar2 xy, unsigned char z) {
  simd_uchar3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(unsigned char other) {
  simd_uchar3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3_undef(unsigned char other) {
  simd_uchar3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar2 other) {
  simd_uchar3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3_undef(simd_uchar2 other) {
  simd_uchar3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar16 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar32 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar3 simd_make_uchar3(simd_uchar64 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(unsigned char x, unsigned char y, unsigned char z, unsigned char w) {
  simd_uchar4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(unsigned char x, unsigned char y, simd_uchar2 zw) {
  simd_uchar4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(unsigned char x, simd_uchar2 yz, unsigned char w) {
  simd_uchar4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar2 xy, unsigned char z, unsigned char w) {
  simd_uchar4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(unsigned char x, simd_uchar3 yzw) {
  simd_uchar4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar2 xy, simd_uchar2 zw) {
  simd_uchar4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar3 xyz, unsigned char w) {
  simd_uchar4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(unsigned char other) {
  simd_uchar4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4_undef(unsigned char other) {
  simd_uchar4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar2 other) {
  simd_uchar4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4_undef(simd_uchar2 other) {
  simd_uchar4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar3 other) {
  simd_uchar4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4_undef(simd_uchar3 other) {
  simd_uchar4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar16 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar32 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar4 simd_make_uchar4(simd_uchar64 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar4 lo, simd_uchar4 hi) {
  simd_uchar8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(unsigned char other) {
  simd_uchar8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8_undef(unsigned char other) {
  simd_uchar8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar2 other) {
  simd_uchar8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8_undef(simd_uchar2 other) {
  simd_uchar8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar3 other) {
  simd_uchar8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8_undef(simd_uchar3 other) {
  simd_uchar8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar4 other) {
  simd_uchar8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8_undef(simd_uchar4 other) {
  simd_uchar8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar16 other) {
  return simd_make_uchar8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar32 other) {
  return simd_make_uchar8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar8 simd_make_uchar8(simd_uchar64 other) {
  return simd_make_uchar8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar8 lo, simd_uchar8 hi) {
  simd_uchar16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(unsigned char other) {
  simd_uchar16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16_undef(unsigned char other) {
  simd_uchar16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar2 other) {
  simd_uchar16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16_undef(simd_uchar2 other) {
  simd_uchar16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar3 other) {
  simd_uchar16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16_undef(simd_uchar3 other) {
  simd_uchar16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar4 other) {
  simd_uchar16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16_undef(simd_uchar4 other) {
  simd_uchar16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar8 other) {
  simd_uchar16 result = 0;
  result.lo = simd_make_uchar8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16_undef(simd_uchar8 other) {
  simd_uchar16 result;
  result.lo = simd_make_uchar8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar16 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of sixteen 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar32 other) {
  return simd_make_uchar16(other.lo);
}

/*! @abstract Truncates `other` to form a vector of sixteen 8-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uchar16 simd_make_uchar16(simd_uchar64 other) {
  return simd_make_uchar16(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar16 lo, simd_uchar16 hi) {
  simd_uchar32 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(unsigned char other) {
  simd_uchar32 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(unsigned char other) {
  simd_uchar32 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar2 other) {
  simd_uchar32 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(simd_uchar2 other) {
  simd_uchar32 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar3 other) {
  simd_uchar32 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(simd_uchar3 other) {
  simd_uchar32 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar4 other) {
  simd_uchar32 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(simd_uchar4 other) {
  simd_uchar32 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar8 other) {
  simd_uchar32 result = 0;
  result.lo = simd_make_uchar16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(simd_uchar8 other) {
  simd_uchar32 result;
  result.lo = simd_make_uchar16(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar16 other) {
  simd_uchar32 result = 0;
  result.lo = simd_make_uchar16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32_undef(simd_uchar16 other) {
  simd_uchar32 result;
  result.lo = simd_make_uchar16(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar32 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of thirty-two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar32 simd_make_uchar32(simd_uchar64 other) {
  return simd_make_uchar32(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixty-four
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar32 lo, simd_uchar32 hi) {
  simd_uchar64 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(unsigned char other) {
  simd_uchar64 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(unsigned char other) {
  simd_uchar64 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar2 other) {
  simd_uchar64 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar2 other) {
  simd_uchar64 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar3 other) {
  simd_uchar64 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar3 other) {
  simd_uchar64 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar4 other) {
  simd_uchar64 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar4 other) {
  simd_uchar64 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar8 other) {
  simd_uchar64 result = 0;
  result.lo = simd_make_uchar32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar8 other) {
  simd_uchar64 result;
  result.lo = simd_make_uchar32(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar16 other) {
  simd_uchar64 result = 0;
  result.lo = simd_make_uchar32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar16 other) {
  simd_uchar64 result;
  result.lo = simd_make_uchar32(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixty-four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar32 other) {
  simd_uchar64 result = 0;
  result.lo = simd_make_uchar32(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64_undef(simd_uchar32 other) {
  simd_uchar64 result;
  result.lo = simd_make_uchar32(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uchar64 simd_make_uchar64(simd_uchar64 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short2 simd_make_short2(short x, short y) {
  simd_short2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short2 simd_make_short2(short other) {
  simd_short2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short2 simd_make_short2_undef(short other) {
  simd_short2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short16 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_short2 simd_make_short2(simd_short32 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short3 simd_make_short3(short x, short y, short z) {
  simd_short3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short3 simd_make_short3(short x, simd_short2 yz) {
  simd_short3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short2 xy, short z) {
  simd_short3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(short other) {
  simd_short3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short3 simd_make_short3_undef(short other) {
  simd_short3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short2 other) {
  simd_short3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short3 simd_make_short3_undef(simd_short2 other) {
  simd_short3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short16 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short3 simd_make_short3(simd_short32 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  16-bit signed (twos-complement) integers.                                 */
static inline SIMD_CFUNC simd_short4 simd_make_short4(short x, short y, short z, short w) {
  simd_short4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(short x, short y, simd_short2 zw) {
  simd_short4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(short x, simd_short2 yz, short w) {
  simd_short4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short2 xy, short z, short w) {
  simd_short4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(short x, simd_short3 yzw) {
  simd_short4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short2 xy, simd_short2 zw) {
  simd_short4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short3 xyz, short w) {
  simd_short4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(short other) {
  simd_short4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short4 simd_make_short4_undef(short other) {
  simd_short4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short2 other) {
  simd_short4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short4 simd_make_short4_undef(simd_short2 other) {
  simd_short4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short3 other) {
  simd_short4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short4 simd_make_short4_undef(simd_short3 other) {
  simd_short4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short16 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short4 simd_make_short4(simd_short32 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short4 lo, simd_short4 hi) {
  simd_short8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(short other) {
  simd_short8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short8 simd_make_short8_undef(short other) {
  simd_short8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short2 other) {
  simd_short8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short8 simd_make_short8_undef(simd_short2 other) {
  simd_short8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short3 other) {
  simd_short8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short8 simd_make_short8_undef(simd_short3 other) {
  simd_short8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short4 other) {
  simd_short8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_short8 simd_make_short8_undef(simd_short4 other) {
  simd_short8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short16 other) {
  return simd_make_short8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short8 simd_make_short8(simd_short32 other) {
  return simd_make_short8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short8 lo, simd_short8 hi) {
  simd_short16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(short other) {
  simd_short16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short16 simd_make_short16_undef(short other) {
  simd_short16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short2 other) {
  simd_short16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short16 simd_make_short16_undef(simd_short2 other) {
  simd_short16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short3 other) {
  simd_short16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short16 simd_make_short16_undef(simd_short3 other) {
  simd_short16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short4 other) {
  simd_short16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short16 simd_make_short16_undef(simd_short4 other) {
  simd_short16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short8 other) {
  simd_short16 result = 0;
  result.lo = simd_make_short8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short16 simd_make_short16_undef(simd_short8 other) {
  simd_short16 result;
  result.lo = simd_make_short8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short16 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_short16 simd_make_short16(simd_short32 other) {
  return simd_make_short16(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  16-bit signed (twos-complement) integers.                                 */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short16 lo, simd_short16 hi) {
  simd_short32 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(short other) {
  simd_short32 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(short other) {
  simd_short32 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short2 other) {
  simd_short32 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(simd_short2 other) {
  simd_short32 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short3 other) {
  simd_short32 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(simd_short3 other) {
  simd_short32 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short4 other) {
  simd_short32 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(simd_short4 other) {
  simd_short32 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short8 other) {
  simd_short32 result = 0;
  result.lo = simd_make_short16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(simd_short8 other) {
  simd_short32 result;
  result.lo = simd_make_short16(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short16 other) {
  simd_short32 result = 0;
  result.lo = simd_make_short16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_short32 simd_make_short32_undef(simd_short16 other) {
  simd_short32 result;
  result.lo = simd_make_short16(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_short32 simd_make_short32(simd_short32 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(unsigned short x, unsigned short y) {
  simd_ushort2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(unsigned short other) {
  simd_ushort2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2_undef(unsigned short other) {
  simd_ushort2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort16 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort2 simd_make_ushort2(simd_ushort32 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(unsigned short x, unsigned short y, unsigned short z) {
  simd_ushort3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(unsigned short x, simd_ushort2 yz) {
  simd_ushort3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort2 xy, unsigned short z) {
  simd_ushort3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(unsigned short other) {
  simd_ushort3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3_undef(unsigned short other) {
  simd_ushort3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort2 other) {
  simd_ushort3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3_undef(simd_ushort2 other) {
  simd_ushort3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort16 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort3 simd_make_ushort3(simd_ushort32 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  16-bit unsigned integers.                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w) {
  simd_ushort4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(unsigned short x, unsigned short y, simd_ushort2 zw) {
  simd_ushort4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(unsigned short x, simd_ushort2 yz, unsigned short w) {
  simd_ushort4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort2 xy, unsigned short z, unsigned short w) {
  simd_ushort4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(unsigned short x, simd_ushort3 yzw) {
  simd_ushort4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort2 xy, simd_ushort2 zw) {
  simd_ushort4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort3 xyz, unsigned short w) {
  simd_ushort4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(unsigned short other) {
  simd_ushort4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4_undef(unsigned short other) {
  simd_ushort4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort2 other) {
  simd_ushort4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4_undef(simd_ushort2 other) {
  simd_ushort4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort3 other) {
  simd_ushort4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4_undef(simd_ushort3 other) {
  simd_ushort4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort16 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort4 simd_make_ushort4(simd_ushort32 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort4 lo, simd_ushort4 hi) {
  simd_ushort8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(unsigned short other) {
  simd_ushort8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8_undef(unsigned short other) {
  simd_ushort8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort2 other) {
  simd_ushort8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8_undef(simd_ushort2 other) {
  simd_ushort8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort3 other) {
  simd_ushort8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8_undef(simd_ushort3 other) {
  simd_ushort8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort4 other) {
  simd_ushort8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8_undef(simd_ushort4 other) {
  simd_ushort8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort16 other) {
  return simd_make_ushort8(other.lo);
}

/*! @abstract Truncates `other` to form a vector of eight 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort8 simd_make_ushort8(simd_ushort32 other) {
  return simd_make_ushort8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort8 lo, simd_ushort8 hi) {
  simd_ushort16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(unsigned short other) {
  simd_ushort16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16_undef(unsigned short other) {
  simd_ushort16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort2 other) {
  simd_ushort16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16_undef(simd_ushort2 other) {
  simd_ushort16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort3 other) {
  simd_ushort16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16_undef(simd_ushort3 other) {
  simd_ushort16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort4 other) {
  simd_ushort16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16_undef(simd_ushort4 other) {
  simd_ushort16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort8 other) {
  simd_ushort16 result = 0;
  result.lo = simd_make_ushort8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16_undef(simd_ushort8 other) {
  simd_ushort16 result;
  result.lo = simd_make_ushort8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort16 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of sixteen 16-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ushort16 simd_make_ushort16(simd_ushort32 other) {
  return simd_make_ushort16(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  16-bit unsigned integers.                                                 */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort16 lo, simd_ushort16 hi) {
  simd_ushort32 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(unsigned short other) {
  simd_ushort32 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(unsigned short other) {
  simd_ushort32 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort2 other) {
  simd_ushort32 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(simd_ushort2 other) {
  simd_ushort32 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort3 other) {
  simd_ushort32 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(simd_ushort3 other) {
  simd_ushort32 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort4 other) {
  simd_ushort32 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(simd_ushort4 other) {
  simd_ushort32 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort8 other) {
  simd_ushort32 result = 0;
  result.lo = simd_make_ushort16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(simd_ushort8 other) {
  simd_ushort32 result;
  result.lo = simd_make_ushort16(other);
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of thirty-two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort16 other) {
  simd_ushort32 result = 0;
  result.lo = simd_make_ushort16(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32_undef(simd_ushort16 other) {
  simd_ushort32 result;
  result.lo = simd_make_ushort16(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ushort32 simd_make_ushort32(simd_ushort32 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int2 simd_make_int2(int x, int y) {
  simd_int2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int2 simd_make_int2(int other) {
  simd_int2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int2 simd_make_int2_undef(int other) {
  simd_int2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_int2 simd_make_int2(simd_int2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_int2 simd_make_int2(simd_int3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_int2 simd_make_int2(simd_int4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_int2 simd_make_int2(simd_int8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_int2 simd_make_int2(simd_int16 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int3 simd_make_int3(int x, int y, int z) {
  simd_int3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int3 simd_make_int3(int x, simd_int2 yz) {
  simd_int3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int2 xy, int z) {
  simd_int3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int3 simd_make_int3(int other) {
  simd_int3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int3 simd_make_int3_undef(int other) {
  simd_int3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int2 other) {
  simd_int3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int3 simd_make_int3_undef(simd_int2 other) {
  simd_int3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int3 simd_make_int3(simd_int16 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit signed (twos-complement) integers.                                 */
static inline SIMD_CFUNC simd_int4 simd_make_int4(int x, int y, int z, int w) {
  simd_int4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(int x, int y, simd_int2 zw) {
  simd_int4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(int x, simd_int2 yz, int w) {
  simd_int4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int2 xy, int z, int w) {
  simd_int4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(int x, simd_int3 yzw) {
  simd_int4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int2 xy, simd_int2 zw) {
  simd_int4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int3 xyz, int w) {
  simd_int4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int4 simd_make_int4(int other) {
  simd_int4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int4 simd_make_int4_undef(int other) {
  simd_int4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int2 other) {
  simd_int4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int4 simd_make_int4_undef(simd_int2 other) {
  simd_int4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int3 other) {
  simd_int4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int4 simd_make_int4_undef(simd_int3 other) {
  simd_int4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int4 simd_make_int4(simd_int16 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int4 lo, simd_int4 hi) {
  simd_int8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int8 simd_make_int8(int other) {
  simd_int8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int8 simd_make_int8_undef(int other) {
  simd_int8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int2 other) {
  simd_int8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int8 simd_make_int8_undef(simd_int2 other) {
  simd_int8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int3 other) {
  simd_int8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int8 simd_make_int8_undef(simd_int3 other) {
  simd_int8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int4 other) {
  simd_int8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_int8 simd_make_int8_undef(simd_int4 other) {
  simd_int8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int8 simd_make_int8(simd_int16 other) {
  return simd_make_int8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int8 lo, simd_int8 hi) {
  simd_int16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int16 simd_make_int16(int other) {
  simd_int16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_int16 simd_make_int16_undef(int other) {
  simd_int16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int2 other) {
  simd_int16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_int16 simd_make_int16_undef(simd_int2 other) {
  simd_int16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int3 other) {
  simd_int16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_int16 simd_make_int16_undef(simd_int3 other) {
  simd_int16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int4 other) {
  simd_int16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_int16 simd_make_int16_undef(simd_int4 other) {
  simd_int16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int8 other) {
  simd_int16 result = 0;
  result.lo = simd_make_int8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
static inline SIMD_CFUNC simd_int16 simd_make_int16_undef(simd_int8 other) {
  simd_int16 result;
  result.lo = simd_make_int8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_int16 simd_make_int16(simd_int16 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(unsigned int x, unsigned int y) {
  simd_uint2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(unsigned int other) {
  simd_uint2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2_undef(unsigned int other) {
  simd_uint2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(simd_uint2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(simd_uint3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(simd_uint4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(simd_uint8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint2 simd_make_uint2(simd_uint16 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(unsigned int x, unsigned int y, unsigned int z) {
  simd_uint3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(unsigned int x, simd_uint2 yz) {
  simd_uint3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint2 xy, unsigned int z) {
  simd_uint3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(unsigned int other) {
  simd_uint3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3_undef(unsigned int other) {
  simd_uint3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint2 other) {
  simd_uint3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3_undef(simd_uint2 other) {
  simd_uint3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint3 simd_make_uint3(simd_uint16 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit unsigned integers.                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(unsigned int x, unsigned int y, unsigned int z, unsigned int w) {
  simd_uint4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(unsigned int x, unsigned int y, simd_uint2 zw) {
  simd_uint4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(unsigned int x, simd_uint2 yz, unsigned int w) {
  simd_uint4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint2 xy, unsigned int z, unsigned int w) {
  simd_uint4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(unsigned int x, simd_uint3 yzw) {
  simd_uint4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint2 xy, simd_uint2 zw) {
  simd_uint4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint3 xyz, unsigned int w) {
  simd_uint4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(unsigned int other) {
  simd_uint4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4_undef(unsigned int other) {
  simd_uint4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint2 other) {
  simd_uint4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4_undef(simd_uint2 other) {
  simd_uint4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint3 other) {
  simd_uint4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4_undef(simd_uint3 other) {
  simd_uint4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint4 simd_make_uint4(simd_uint16 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint4 lo, simd_uint4 hi) {
  simd_uint8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(unsigned int other) {
  simd_uint8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8_undef(unsigned int other) {
  simd_uint8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint2 other) {
  simd_uint8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8_undef(simd_uint2 other) {
  simd_uint8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint3 other) {
  simd_uint8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8_undef(simd_uint3 other) {
  simd_uint8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint4 other) {
  simd_uint8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8_undef(simd_uint4 other) {
  simd_uint8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 32-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_uint8 simd_make_uint8(simd_uint16 other) {
  return simd_make_uint8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint8 lo, simd_uint8 hi) {
  simd_uint16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(unsigned int other) {
  simd_uint16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16_undef(unsigned int other) {
  simd_uint16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint2 other) {
  simd_uint16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16_undef(simd_uint2 other) {
  simd_uint16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint3 other) {
  simd_uint16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16_undef(simd_uint3 other) {
  simd_uint16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint4 other) {
  simd_uint16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16_undef(simd_uint4 other) {
  simd_uint16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint8 other) {
  simd_uint16 result = 0;
  result.lo = simd_make_uint8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16_undef(simd_uint8 other) {
  simd_uint16 result;
  result.lo = simd_make_uint8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_uint16 simd_make_uint16(simd_uint16 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float2 simd_make_float2(float x, float y) {
  simd_float2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float2 simd_make_float2(float other) {
  simd_float2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_float2 simd_make_float2_undef(float other) {
  simd_float2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_float2 simd_make_float2(simd_float2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float2 simd_make_float2(simd_float3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float2 simd_make_float2(simd_float4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float2 simd_make_float2(simd_float8 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float2 simd_make_float2(simd_float16 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float3 simd_make_float3(float x, float y, float z) {
  simd_float3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float3 simd_make_float3(float x, simd_float2 yz) {
  simd_float3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float2 xy, float z) {
  simd_float3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float3 simd_make_float3(float other) {
  simd_float3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float3 simd_make_float3_undef(float other) {
  simd_float3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float2 other) {
  simd_float3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float3 simd_make_float3_undef(simd_float2 other) {
  simd_float3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float8 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float3 simd_make_float3(simd_float16 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit floating-point numbers.                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(float x, float y, float z, float w) {
  simd_float4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(float x, float y, simd_float2 zw) {
  simd_float4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(float x, simd_float2 yz, float w) {
  simd_float4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float2 xy, float z, float w) {
  simd_float4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(float x, simd_float3 yzw) {
  simd_float4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float2 xy, simd_float2 zw) {
  simd_float4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float3 xyz, float w) {
  simd_float4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(float other) {
  simd_float4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_float4 simd_make_float4_undef(float other) {
  simd_float4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float2 other) {
  simd_float4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_float4 simd_make_float4_undef(simd_float2 other) {
  simd_float4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float3 other) {
  simd_float4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_float4 simd_make_float4_undef(simd_float3 other) {
  simd_float4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float8 other) {
  return other.xyzw;
}

/*! @abstract Truncates `other` to form a vector of four 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float4 simd_make_float4(simd_float16 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float4 lo, simd_float4 hi) {
  simd_float8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float8 simd_make_float8(float other) {
  simd_float8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float8 simd_make_float8_undef(float other) {
  simd_float8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float2 other) {
  simd_float8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float8 simd_make_float8_undef(simd_float2 other) {
  simd_float8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float3 other) {
  simd_float8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float8 simd_make_float8_undef(simd_float3 other) {
  simd_float8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float4 other) {
  simd_float8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float8 simd_make_float8_undef(simd_float4 other) {
  simd_float8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float8 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of eight 32-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_float8 simd_make_float8(simd_float16 other) {
  return simd_make_float8(other.lo);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float8 lo, simd_float8 hi) {
  simd_float16 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(float other) {
  simd_float16 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float16 simd_make_float16_undef(float other) {
  simd_float16 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float2 other) {
  simd_float16 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float16 simd_make_float16_undef(simd_float2 other) {
  simd_float16 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float3 other) {
  simd_float16 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float16 simd_make_float16_undef(simd_float3 other) {
  simd_float16 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float4 other) {
  simd_float16 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float16 simd_make_float16_undef(simd_float4 other) {
  simd_float16 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float8 other) {
  simd_float16 result = 0;
  result.lo = simd_make_float8(other);
  return result;
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_float16 simd_make_float16_undef(simd_float8 other) {
  simd_float16 result;
  result.lo = simd_make_float8(other);
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_float16 simd_make_float16(simd_float16 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long1 x, simd_long1 y) {
  simd_long2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long1 other) {
  simd_long2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long2 simd_make_long2_undef(simd_long1 other) {
  simd_long2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit signed (twos-
 *  complement) integers.                                                     */
static inline SIMD_CFUNC simd_long2 simd_make_long2(simd_long8 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long1 x, simd_long1 y, simd_long1 z) {
  simd_long3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long1 x, simd_long2 yz) {
  simd_long3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long2 xy, simd_long1 z) {
  simd_long3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long1 other) {
  simd_long3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long3 simd_make_long3_undef(simd_long1 other) {
  simd_long3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long2 other) {
  simd_long3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long3 simd_make_long3_undef(simd_long2 other) {
  simd_long3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long3 simd_make_long3(simd_long8 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit signed (twos-complement) integers.                                 */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long1 x, simd_long1 y, simd_long1 z, simd_long1 w) {
  simd_long4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long1 x, simd_long1 y, simd_long2 zw) {
  simd_long4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long1 x, simd_long2 yz, simd_long1 w) {
  simd_long4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long2 xy, simd_long1 z, simd_long1 w) {
  simd_long4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long1 x, simd_long3 yzw) {
  simd_long4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long2 xy, simd_long2 zw) {
  simd_long4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long3 xyz, simd_long1 w) {
  simd_long4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long1 other) {
  simd_long4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long4 simd_make_long4_undef(simd_long1 other) {
  simd_long4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long2 other) {
  simd_long4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long4 simd_make_long4_undef(simd_long2 other) {
  simd_long4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long3 other) {
  simd_long4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long4 simd_make_long4_undef(simd_long3 other) {
  simd_long4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long4 simd_make_long4(simd_long8 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long4 lo, simd_long4 hi) {
  simd_long8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long1 other) {
  simd_long8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long8 simd_make_long8_undef(simd_long1 other) {
  simd_long8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long2 other) {
  simd_long8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long8 simd_make_long8_undef(simd_long2 other) {
  simd_long8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long3 other) {
  simd_long8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long8 simd_make_long8_undef(simd_long3 other) {
  simd_long8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long4 other) {
  simd_long8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_long8 simd_make_long8_undef(simd_long4 other) {
  simd_long8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_long8 simd_make_long8(simd_long8 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong1 x, simd_ulong1 y) {
  simd_ulong2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong1 other) {
  simd_ulong2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2_undef(simd_ulong1 other) {
  simd_ulong2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong2 simd_make_ulong2(simd_ulong8 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong1 x, simd_ulong1 y, simd_ulong1 z) {
  simd_ulong3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong1 x, simd_ulong2 yz) {
  simd_ulong3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong2 xy, simd_ulong1 z) {
  simd_ulong3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong1 other) {
  simd_ulong3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3_undef(simd_ulong1 other) {
  simd_ulong3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong2 other) {
  simd_ulong3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3_undef(simd_ulong2 other) {
  simd_ulong3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong3 simd_make_ulong3(simd_ulong8 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit unsigned integers.                                                 */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong1 x, simd_ulong1 y, simd_ulong1 z, simd_ulong1 w) {
  simd_ulong4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong1 x, simd_ulong1 y, simd_ulong2 zw) {
  simd_ulong4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong1 x, simd_ulong2 yz, simd_ulong1 w) {
  simd_ulong4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong2 xy, simd_ulong1 z, simd_ulong1 w) {
  simd_ulong4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong1 x, simd_ulong3 yzw) {
  simd_ulong4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong2 xy, simd_ulong2 zw) {
  simd_ulong4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong3 xyz, simd_ulong1 w) {
  simd_ulong4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong1 other) {
  simd_ulong4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4_undef(simd_ulong1 other) {
  simd_ulong4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong2 other) {
  simd_ulong4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4_undef(simd_ulong2 other) {
  simd_ulong4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong3 other) {
  simd_ulong4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4_undef(simd_ulong3 other) {
  simd_ulong4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong4 simd_make_ulong4(simd_ulong8 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong4 lo, simd_ulong4 hi) {
  simd_ulong8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong1 other) {
  simd_ulong8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8_undef(simd_ulong1 other) {
  simd_ulong8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong2 other) {
  simd_ulong8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8_undef(simd_ulong2 other) {
  simd_ulong8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong3 other) {
  simd_ulong8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8_undef(simd_ulong3 other) {
  simd_ulong8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit unsigned
 *  integers.                                                                 */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong4 other) {
  simd_ulong8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8_undef(simd_ulong4 other) {
  simd_ulong8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_ulong8 simd_make_ulong8(simd_ulong8 other) {
  return other;
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double2 simd_make_double2(double x, double y) {
  simd_double2 result;
  result.x = x;
  result.y = y;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of two 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double2 simd_make_double2(double other) {
  simd_double2 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_double2 simd_make_double2_undef(double other) {
  simd_double2 result;
  result.x = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_double2 simd_make_double2(simd_double2 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double2 simd_make_double2(simd_double3 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double2 simd_make_double2(simd_double4 other) {
  return other.xy;
}

/*! @abstract Truncates `other` to form a vector of two 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double2 simd_make_double2(simd_double8 other) {
  return other.xy;
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double3 simd_make_double3(double x, double y, double z) {
  simd_double3 result;
  result.x = x;
  result.y = y;
  result.z = z;
  return result;
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double3 simd_make_double3(double x, simd_double2 yz) {
  simd_double3 result;
  result.x = x;
  result.yz = yz;
  return result;
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double3 simd_make_double3(simd_double2 xy, double z) {
  simd_double3 result;
  result.xy = xy;
  result.z = z;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double3 simd_make_double3(double other) {
  simd_double3 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double3 simd_make_double3_undef(double other) {
  simd_double3 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double3 simd_make_double3(simd_double2 other) {
  simd_double3 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double3 simd_make_double3_undef(simd_double2 other) {
  simd_double3 result;
  result.xy = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_double3 simd_make_double3(simd_double3 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double3 simd_make_double3(simd_double4 other) {
  return other.xyz;
}

/*! @abstract Truncates `other` to form a vector of three 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double3 simd_make_double3(simd_double8 other) {
  return other.xyz;
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit floating-point numbers.                                            */
static inline SIMD_CFUNC simd_double4 simd_make_double4(double x, double y, double z, double w) {
  simd_double4 result;
  result.x = x;
  result.y = y;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(double x, double y, simd_double2 zw) {
  simd_double4 result;
  result.x = x;
  result.y = y;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(double x, simd_double2 yz, double w) {
  simd_double4 result;
  result.x = x;
  result.yz = yz;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double2 xy, double z, double w) {
  simd_double4 result;
  result.xy = xy;
  result.z = z;
  result.w = w;
  return result;
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(double x, simd_double3 yzw) {
  simd_double4 result;
  result.x = x;
  result.yzw = yzw;
  return result;
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double2 xy, simd_double2 zw) {
  simd_double4 result;
  result.xy = xy;
  result.zw = zw;
  return result;
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double3 xyz, double w) {
  simd_double4 result;
  result.xyz = xyz;
  result.w = w;
  return result;
}
  
/*! @abstract Zero-extends `other` to form a vector of four 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double4 simd_make_double4(double other) {
  simd_double4 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_double4 simd_make_double4_undef(double other) {
  simd_double4 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double2 other) {
  simd_double4 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_double4 simd_make_double4_undef(simd_double2 other) {
  simd_double4 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of four 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double3 other) {
  simd_double4 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
static inline SIMD_CFUNC simd_double4 simd_make_double4_undef(simd_double3 other) {
  simd_double4 result;
  result.xyz = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double4 other) {
  return other;
}

/*! @abstract Truncates `other` to form a vector of four 64-bit floating-
 *  point numbers.                                                            */
static inline SIMD_CFUNC simd_double4 simd_make_double4(simd_double8 other) {
  return other.xyzw;
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double8 simd_make_double8(simd_double4 lo, simd_double4 hi) {
  simd_double8 result;
  result.lo = lo;
  result.hi = hi;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double8 simd_make_double8(double other) {
  simd_double8 result = 0;
  result.x = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double8 simd_make_double8_undef(double other) {
  simd_double8 result;
  result.x = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double8 simd_make_double8(simd_double2 other) {
  simd_double8 result = 0;
  result.xy = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double8 simd_make_double8_undef(simd_double2 other) {
  simd_double8 result;
  result.xy = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double8 simd_make_double8(simd_double3 other) {
  simd_double8 result = 0;
  result.xyz = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double8 simd_make_double8_undef(simd_double3 other) {
  simd_double8 result;
  result.xyz = other;
  return result;
}

/*! @abstract Zero-extends `other` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CFUNC simd_double8 simd_make_double8(simd_double4 other) {
  simd_double8 result = 0;
  result.xyzw = other;
  return result;
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
static inline SIMD_CFUNC simd_double8 simd_make_double8_undef(simd_double4 other) {
  simd_double8 result;
  result.xyzw = other;
  return result;
}

/*! @abstract Returns `other` unmodified. This function is a convenience for
 *  templated and autogenerated code.                                         */
static inline SIMD_CFUNC simd_double8 simd_make_double8(simd_double8 other) {
  return other;
}

#ifdef __cplusplus
} /* extern "C" */

#include <tuple>
#include <simd/packed.h>

namespace simd {
/*! @abstract Concatenates `x` and `y` to form a vector of two 8-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CPPFUNC char2 make_char2(char x, char y) {
 return ::simd_make_char2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  8-bit signed (twos-complement) integers.                                  */
template <typename typeN> static SIMD_CPPFUNC char2 make_char2(typeN other) {
  return ::simd_make_char2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC char2 make_char2_undef(typeN other) {
  return ::simd_make_char2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char3 make_char3(char x, char y, char z) {
 return ::simd_make_char3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char3 make_char3(char x, char2 yz) {
 return ::simd_make_char3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char3 make_char3(char2 xy, char z) {
 return ::simd_make_char3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  8-bit signed (twos-complement) integers.                                  */
template <typename typeN> static SIMD_CPPFUNC char3 make_char3(typeN other) {
  return ::simd_make_char3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC char3 make_char3_undef(typeN other) {
  return ::simd_make_char3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CPPFUNC char4 make_char4(char x, char y, char z, char w) {
 return ::simd_make_char4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char x, char y, char2 zw) {
 return ::simd_make_char4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char x, char2 yz, char w) {
 return ::simd_make_char4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char2 xy, char z, char w) {
 return ::simd_make_char4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char x, char3 yzw) {
 return ::simd_make_char4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char2 xy, char2 zw) {
 return ::simd_make_char4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char4 make_char4(char3 xyz, char w) {
 return ::simd_make_char4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  8-bit signed (twos-complement) integers.                                  */
template <typename typeN> static SIMD_CPPFUNC char4 make_char4(typeN other) {
  return ::simd_make_char4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC char4 make_char4_undef(typeN other) {
  return ::simd_make_char4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char8 make_char8(char4 lo, char4 hi) {
 return ::simd_make_char8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  8-bit signed (twos-complement) integers.                                  */
template <typename typeN> static SIMD_CPPFUNC char8 make_char8(typeN other) {
  return ::simd_make_char8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC char8 make_char8_undef(typeN other) {
  return ::simd_make_char8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 8-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC char16 make_char16(char8 lo, char8 hi) {
 return ::simd_make_char16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  8-bit signed (twos-complement) integers.                                  */
template <typename typeN> static SIMD_CPPFUNC char16 make_char16(typeN other) {
  return ::simd_make_char16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC char16 make_char16_undef(typeN other) {
  return ::simd_make_char16_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CPPFUNC char32 make_char32(char16 lo, char16 hi) {
 return ::simd_make_char32(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of thirty-
 *  two 8-bit signed (twos-complement) integers.                              */
template <typename typeN> static SIMD_CPPFUNC char32 make_char32(typeN other) {
  return ::simd_make_char32(other);
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC char32 make_char32_undef(typeN other) {
  return ::simd_make_char32_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixty-four
 *  8-bit signed (twos-complement) integers.                                  */
static inline SIMD_CPPFUNC char64 make_char64(char32 lo, char32 hi) {
 return ::simd_make_char64(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixty-
 *  four 8-bit signed (twos-complement) integers.                             */
template <typename typeN> static SIMD_CPPFUNC char64 make_char64(typeN other) {
  return ::simd_make_char64(other);
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC char64 make_char64_undef(typeN other) {
  return ::simd_make_char64_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar2 make_uchar2(unsigned char x, unsigned char y) {
 return ::simd_make_uchar2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  8-bit unsigned integers.                                                  */
template <typename typeN> static SIMD_CPPFUNC uchar2 make_uchar2(typeN other) {
  return ::simd_make_uchar2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar2 make_uchar2_undef(typeN other) {
  return ::simd_make_uchar2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar3 make_uchar3(unsigned char x, unsigned char y, unsigned char z) {
 return ::simd_make_uchar3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar3 make_uchar3(unsigned char x, uchar2 yz) {
 return ::simd_make_uchar3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar3 make_uchar3(uchar2 xy, unsigned char z) {
 return ::simd_make_uchar3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  8-bit unsigned integers.                                                  */
template <typename typeN> static SIMD_CPPFUNC uchar3 make_uchar3(typeN other) {
  return ::simd_make_uchar3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar3 make_uchar3_undef(typeN other) {
  return ::simd_make_uchar3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CPPFUNC uchar4 make_uchar4(unsigned char x, unsigned char y, unsigned char z, unsigned char w) {
 return ::simd_make_uchar4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(unsigned char x, unsigned char y, uchar2 zw) {
 return ::simd_make_uchar4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(unsigned char x, uchar2 yz, unsigned char w) {
 return ::simd_make_uchar4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(uchar2 xy, unsigned char z, unsigned char w) {
 return ::simd_make_uchar4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(unsigned char x, uchar3 yzw) {
 return ::simd_make_uchar4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(uchar2 xy, uchar2 zw) {
 return ::simd_make_uchar4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar4 make_uchar4(uchar3 xyz, unsigned char w) {
 return ::simd_make_uchar4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  8-bit unsigned integers.                                                  */
template <typename typeN> static SIMD_CPPFUNC uchar4 make_uchar4(typeN other) {
  return ::simd_make_uchar4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar4 make_uchar4_undef(typeN other) {
  return ::simd_make_uchar4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar8 make_uchar8(uchar4 lo, uchar4 hi) {
 return ::simd_make_uchar8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  8-bit unsigned integers.                                                  */
template <typename typeN> static SIMD_CPPFUNC uchar8 make_uchar8(typeN other) {
  return ::simd_make_uchar8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar8 make_uchar8_undef(typeN other) {
  return ::simd_make_uchar8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 8-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uchar16 make_uchar16(uchar8 lo, uchar8 hi) {
 return ::simd_make_uchar16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  8-bit unsigned integers.                                                  */
template <typename typeN> static SIMD_CPPFUNC uchar16 make_uchar16(typeN other) {
  return ::simd_make_uchar16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar16 make_uchar16_undef(typeN other) {
  return ::simd_make_uchar16_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CPPFUNC uchar32 make_uchar32(uchar16 lo, uchar16 hi) {
 return ::simd_make_uchar32(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of thirty-
 *  two 8-bit unsigned integers.                                              */
template <typename typeN> static SIMD_CPPFUNC uchar32 make_uchar32(typeN other) {
  return ::simd_make_uchar32(other);
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar32 make_uchar32_undef(typeN other) {
  return ::simd_make_uchar32_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixty-four
 *  8-bit unsigned integers.                                                  */
static inline SIMD_CPPFUNC uchar64 make_uchar64(uchar32 lo, uchar32 hi) {
 return ::simd_make_uchar64(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixty-
 *  four 8-bit unsigned integers.                                             */
template <typename typeN> static SIMD_CPPFUNC uchar64 make_uchar64(typeN other) {
  return ::simd_make_uchar64(other);
}
  
/*! @abstract Extends `other` to form a vector of sixty-four 8-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uchar64 make_uchar64_undef(typeN other) {
  return ::simd_make_uchar64_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 16-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CPPFUNC short2 make_short2(short x, short y) {
 return ::simd_make_short2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  16-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC short2 make_short2(typeN other) {
  return ::simd_make_short2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC short2 make_short2_undef(typeN other) {
  return ::simd_make_short2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short3 make_short3(short x, short y, short z) {
 return ::simd_make_short3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short3 make_short3(short x, short2 yz) {
 return ::simd_make_short3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short3 make_short3(short2 xy, short z) {
 return ::simd_make_short3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  16-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC short3 make_short3(typeN other) {
  return ::simd_make_short3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC short3 make_short3_undef(typeN other) {
  return ::simd_make_short3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  16-bit signed (twos-complement) integers.                                 */
static inline SIMD_CPPFUNC short4 make_short4(short x, short y, short z, short w) {
 return ::simd_make_short4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short x, short y, short2 zw) {
 return ::simd_make_short4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short x, short2 yz, short w) {
 return ::simd_make_short4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short2 xy, short z, short w) {
 return ::simd_make_short4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short x, short3 yzw) {
 return ::simd_make_short4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short2 xy, short2 zw) {
 return ::simd_make_short4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short4 make_short4(short3 xyz, short w) {
 return ::simd_make_short4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  16-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC short4 make_short4(typeN other) {
  return ::simd_make_short4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC short4 make_short4_undef(typeN other) {
  return ::simd_make_short4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short8 make_short8(short4 lo, short4 hi) {
 return ::simd_make_short8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  16-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC short8 make_short8(typeN other) {
  return ::simd_make_short8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC short8 make_short8_undef(typeN other) {
  return ::simd_make_short8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 16-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC short16 make_short16(short8 lo, short8 hi) {
 return ::simd_make_short16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  16-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC short16 make_short16(typeN other) {
  return ::simd_make_short16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC short16 make_short16_undef(typeN other) {
  return ::simd_make_short16_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  16-bit signed (twos-complement) integers.                                 */
static inline SIMD_CPPFUNC short32 make_short32(short16 lo, short16 hi) {
 return ::simd_make_short32(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of thirty-
 *  two 16-bit signed (twos-complement) integers.                             */
template <typename typeN> static SIMD_CPPFUNC short32 make_short32(typeN other) {
  return ::simd_make_short32(other);
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC short32 make_short32_undef(typeN other) {
  return ::simd_make_short32_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort2 make_ushort2(unsigned short x, unsigned short y) {
 return ::simd_make_ushort2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  16-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ushort2 make_ushort2(typeN other) {
  return ::simd_make_ushort2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort2 make_ushort2_undef(typeN other) {
  return ::simd_make_ushort2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort3 make_ushort3(unsigned short x, unsigned short y, unsigned short z) {
 return ::simd_make_ushort3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort3 make_ushort3(unsigned short x, ushort2 yz) {
 return ::simd_make_ushort3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort3 make_ushort3(ushort2 xy, unsigned short z) {
 return ::simd_make_ushort3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  16-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ushort3 make_ushort3(typeN other) {
  return ::simd_make_ushort3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort3 make_ushort3_undef(typeN other) {
  return ::simd_make_ushort3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  16-bit unsigned integers.                                                 */
static inline SIMD_CPPFUNC ushort4 make_ushort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w) {
 return ::simd_make_ushort4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(unsigned short x, unsigned short y, ushort2 zw) {
 return ::simd_make_ushort4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(unsigned short x, ushort2 yz, unsigned short w) {
 return ::simd_make_ushort4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(ushort2 xy, unsigned short z, unsigned short w) {
 return ::simd_make_ushort4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(unsigned short x, ushort3 yzw) {
 return ::simd_make_ushort4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(ushort2 xy, ushort2 zw) {
 return ::simd_make_ushort4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort4 make_ushort4(ushort3 xyz, unsigned short w) {
 return ::simd_make_ushort4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  16-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ushort4 make_ushort4(typeN other) {
  return ::simd_make_ushort4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort4 make_ushort4_undef(typeN other) {
  return ::simd_make_ushort4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort8 make_ushort8(ushort4 lo, ushort4 hi) {
 return ::simd_make_ushort8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  16-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ushort8 make_ushort8(typeN other) {
  return ::simd_make_ushort8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort8 make_ushort8_undef(typeN other) {
  return ::simd_make_ushort8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 16-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ushort16 make_ushort16(ushort8 lo, ushort8 hi) {
 return ::simd_make_ushort16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  16-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ushort16 make_ushort16(typeN other) {
  return ::simd_make_ushort16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort16 make_ushort16_undef(typeN other) {
  return ::simd_make_ushort16_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of thirty-two
 *  16-bit unsigned integers.                                                 */
static inline SIMD_CPPFUNC ushort32 make_ushort32(ushort16 lo, ushort16 hi) {
 return ::simd_make_ushort32(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of thirty-
 *  two 16-bit unsigned integers.                                             */
template <typename typeN> static SIMD_CPPFUNC ushort32 make_ushort32(typeN other) {
  return ::simd_make_ushort32(other);
}
  
/*! @abstract Extends `other` to form a vector of thirty-two 16-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ushort32 make_ushort32_undef(typeN other) {
  return ::simd_make_ushort32_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CPPFUNC int2 make_int2(int x, int y) {
 return ::simd_make_int2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  32-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC int2 make_int2(typeN other) {
  return ::simd_make_int2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC int2 make_int2_undef(typeN other) {
  return ::simd_make_int2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int3 make_int3(int x, int y, int z) {
 return ::simd_make_int3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int3 make_int3(int x, int2 yz) {
 return ::simd_make_int3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int3 make_int3(int2 xy, int z) {
 return ::simd_make_int3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  32-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC int3 make_int3(typeN other) {
  return ::simd_make_int3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC int3 make_int3_undef(typeN other) {
  return ::simd_make_int3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit signed (twos-complement) integers.                                 */
static inline SIMD_CPPFUNC int4 make_int4(int x, int y, int z, int w) {
 return ::simd_make_int4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int x, int y, int2 zw) {
 return ::simd_make_int4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int x, int2 yz, int w) {
 return ::simd_make_int4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int2 xy, int z, int w) {
 return ::simd_make_int4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int x, int3 yzw) {
 return ::simd_make_int4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int2 xy, int2 zw) {
 return ::simd_make_int4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int4 make_int4(int3 xyz, int w) {
 return ::simd_make_int4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  32-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC int4 make_int4(typeN other) {
  return ::simd_make_int4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC int4 make_int4_undef(typeN other) {
  return ::simd_make_int4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int8 make_int8(int4 lo, int4 hi) {
 return ::simd_make_int8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  32-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC int8 make_int8(typeN other) {
  return ::simd_make_int8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC int8 make_int8_undef(typeN other) {
  return ::simd_make_int8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC int16 make_int16(int8 lo, int8 hi) {
 return ::simd_make_int16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  32-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC int16 make_int16(typeN other) {
  return ::simd_make_int16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit signed
 *  (twos-complement) integers. The contents of the newly-created vector
 *  lanes are unspecified.                                                    */
template <typename typeN> static SIMD_CPPFUNC int16 make_int16_undef(typeN other) {
  return ::simd_make_int16_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint2 make_uint2(unsigned int x, unsigned int y) {
 return ::simd_make_uint2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  32-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC uint2 make_uint2(typeN other) {
  return ::simd_make_uint2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uint2 make_uint2_undef(typeN other) {
  return ::simd_make_uint2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint3 make_uint3(unsigned int x, unsigned int y, unsigned int z) {
 return ::simd_make_uint3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint3 make_uint3(unsigned int x, uint2 yz) {
 return ::simd_make_uint3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint3 make_uint3(uint2 xy, unsigned int z) {
 return ::simd_make_uint3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  32-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC uint3 make_uint3(typeN other) {
  return ::simd_make_uint3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uint3 make_uint3_undef(typeN other) {
  return ::simd_make_uint3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit unsigned integers.                                                 */
static inline SIMD_CPPFUNC uint4 make_uint4(unsigned int x, unsigned int y, unsigned int z, unsigned int w) {
 return ::simd_make_uint4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(unsigned int x, unsigned int y, uint2 zw) {
 return ::simd_make_uint4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(unsigned int x, uint2 yz, unsigned int w) {
 return ::simd_make_uint4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(uint2 xy, unsigned int z, unsigned int w) {
 return ::simd_make_uint4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(unsigned int x, uint3 yzw) {
 return ::simd_make_uint4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(uint2 xy, uint2 zw) {
 return ::simd_make_uint4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint4 make_uint4(uint3 xyz, unsigned int w) {
 return ::simd_make_uint4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  32-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC uint4 make_uint4(typeN other) {
  return ::simd_make_uint4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uint4 make_uint4_undef(typeN other) {
  return ::simd_make_uint4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint8 make_uint8(uint4 lo, uint4 hi) {
 return ::simd_make_uint8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  32-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC uint8 make_uint8(typeN other) {
  return ::simd_make_uint8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uint8 make_uint8_undef(typeN other) {
  return ::simd_make_uint8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC uint16 make_uint16(uint8 lo, uint8 hi) {
 return ::simd_make_uint16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  32-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC uint16 make_uint16(typeN other) {
  return ::simd_make_uint16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC uint16 make_uint16_undef(typeN other) {
  return ::simd_make_uint16_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float2 make_float2(float x, float y) {
 return ::simd_make_float2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  32-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC float2 make_float2(typeN other) {
  return ::simd_make_float2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
template <typename typeN> static SIMD_CPPFUNC float2 make_float2_undef(typeN other) {
  return ::simd_make_float2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float3 make_float3(float x, float y, float z) {
 return ::simd_make_float3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float3 make_float3(float x, float2 yz) {
 return ::simd_make_float3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float3 make_float3(float2 xy, float z) {
 return ::simd_make_float3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  32-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC float3 make_float3(typeN other) {
  return ::simd_make_float3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC float3 make_float3_undef(typeN other) {
  return ::simd_make_float3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  32-bit floating-point numbers.                                            */
static inline SIMD_CPPFUNC float4 make_float4(float x, float y, float z, float w) {
 return ::simd_make_float4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float x, float y, float2 zw) {
 return ::simd_make_float4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float x, float2 yz, float w) {
 return ::simd_make_float4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float2 xy, float z, float w) {
 return ::simd_make_float4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float x, float3 yzw) {
 return ::simd_make_float4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float2 xy, float2 zw) {
 return ::simd_make_float4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float4 make_float4(float3 xyz, float w) {
 return ::simd_make_float4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  32-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC float4 make_float4(typeN other) {
  return ::simd_make_float4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 32-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
template <typename typeN> static SIMD_CPPFUNC float4 make_float4_undef(typeN other) {
  return ::simd_make_float4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float8 make_float8(float4 lo, float4 hi) {
 return ::simd_make_float8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  32-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC float8 make_float8(typeN other) {
  return ::simd_make_float8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC float8 make_float8_undef(typeN other) {
  return ::simd_make_float8_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of sixteen 32-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC float16 make_float16(float8 lo, float8 hi) {
 return ::simd_make_float16(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of sixteen
 *  32-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC float16 make_float16(typeN other) {
  return ::simd_make_float16(other);
}
  
/*! @abstract Extends `other` to form a vector of sixteen 32-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC float16 make_float16_undef(typeN other) {
  return ::simd_make_float16_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit signed
 *  (twos-complement) integers.                                               */
static inline SIMD_CPPFUNC long2 make_long2(long1 x, long1 y) {
 return ::simd_make_long2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  64-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC long2 make_long2(typeN other) {
  return ::simd_make_long2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC long2 make_long2_undef(typeN other) {
  return ::simd_make_long2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long3 make_long3(long1 x, long1 y, long1 z) {
 return ::simd_make_long3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long3 make_long3(long1 x, long2 yz) {
 return ::simd_make_long3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long3 make_long3(long2 xy, long1 z) {
 return ::simd_make_long3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  64-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC long3 make_long3(typeN other) {
  return ::simd_make_long3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC long3 make_long3_undef(typeN other) {
  return ::simd_make_long3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit signed (twos-complement) integers.                                 */
static inline SIMD_CPPFUNC long4 make_long4(long1 x, long1 y, long1 z, long1 w) {
 return ::simd_make_long4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long1 x, long1 y, long2 zw) {
 return ::simd_make_long4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long1 x, long2 yz, long1 w) {
 return ::simd_make_long4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long2 xy, long1 z, long1 w) {
 return ::simd_make_long4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long1 x, long3 yzw) {
 return ::simd_make_long4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long2 xy, long2 zw) {
 return ::simd_make_long4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long4 make_long4(long3 xyz, long1 w) {
 return ::simd_make_long4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  64-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC long4 make_long4(typeN other) {
  return ::simd_make_long4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC long4 make_long4_undef(typeN other) {
  return ::simd_make_long4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  signed (twos-complement) integers.                                        */
static inline SIMD_CPPFUNC long8 make_long8(long4 lo, long4 hi) {
 return ::simd_make_long8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  64-bit signed (twos-complement) integers.                                 */
template <typename typeN> static SIMD_CPPFUNC long8 make_long8(typeN other) {
  return ::simd_make_long8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit signed (twos-
 *  complement) integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC long8 make_long8_undef(typeN other) {
  return ::simd_make_long8_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong2 make_ulong2(ulong1 x, ulong1 y) {
 return ::simd_make_ulong2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  64-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ulong2 make_ulong2(typeN other) {
  return ::simd_make_ulong2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ulong2 make_ulong2_undef(typeN other) {
  return ::simd_make_ulong2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong3 make_ulong3(ulong1 x, ulong1 y, ulong1 z) {
 return ::simd_make_ulong3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong3 make_ulong3(ulong1 x, ulong2 yz) {
 return ::simd_make_ulong3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong3 make_ulong3(ulong2 xy, ulong1 z) {
 return ::simd_make_ulong3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  64-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ulong3 make_ulong3(typeN other) {
  return ::simd_make_ulong3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ulong3 make_ulong3_undef(typeN other) {
  return ::simd_make_ulong3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit unsigned integers.                                                 */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong1 x, ulong1 y, ulong1 z, ulong1 w) {
 return ::simd_make_ulong4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong1 x, ulong1 y, ulong2 zw) {
 return ::simd_make_ulong4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong1 x, ulong2 yz, ulong1 w) {
 return ::simd_make_ulong4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong2 xy, ulong1 z, ulong1 w) {
 return ::simd_make_ulong4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong1 x, ulong3 yzw) {
 return ::simd_make_ulong4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong2 xy, ulong2 zw) {
 return ::simd_make_ulong4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong4 make_ulong4(ulong3 xyz, ulong1 w) {
 return ::simd_make_ulong4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  64-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ulong4 make_ulong4(typeN other) {
  return ::simd_make_ulong4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ulong4 make_ulong4_undef(typeN other) {
  return ::simd_make_ulong4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  unsigned integers.                                                        */
static inline SIMD_CPPFUNC ulong8 make_ulong8(ulong4 lo, ulong4 hi) {
 return ::simd_make_ulong8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  64-bit unsigned integers.                                                 */
template <typename typeN> static SIMD_CPPFUNC ulong8 make_ulong8(typeN other) {
  return ::simd_make_ulong8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit unsigned
 *  integers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC ulong8 make_ulong8_undef(typeN other) {
  return ::simd_make_ulong8_undef(other);
}

/*! @abstract Concatenates `x` and `y` to form a vector of two 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double2 make_double2(double x, double y) {
 return ::simd_make_double2(x, y);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of two
 *  64-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC double2 make_double2(typeN other) {
  return ::simd_make_double2(other);
}
  
/*! @abstract Extends `other` to form a vector of two 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
template <typename typeN> static SIMD_CPPFUNC double2 make_double2_undef(typeN other) {
  return ::simd_make_double2_undef(other);
}

/*! @abstract Concatenates `x`, `y` and `z` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double3 make_double3(double x, double y, double z) {
 return ::simd_make_double3(x, y, z);
}
  
/*! @abstract Concatenates `x` and `yz` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double3 make_double3(double x, double2 yz) {
 return ::simd_make_double3(x, yz);
}
  
/*! @abstract Concatenates `xy` and `z` to form a vector of three 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double3 make_double3(double2 xy, double z) {
 return ::simd_make_double3(xy, z);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of three
 *  64-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC double3 make_double3(typeN other) {
  return ::simd_make_double3(other);
}
  
/*! @abstract Extends `other` to form a vector of three 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC double3 make_double3_undef(typeN other) {
  return ::simd_make_double3_undef(other);
}

/*! @abstract Concatenates `x`, `y`, `z` and `w` to form a vector of four
 *  64-bit floating-point numbers.                                            */
static inline SIMD_CPPFUNC double4 make_double4(double x, double y, double z, double w) {
 return ::simd_make_double4(x, y, z, w);
}
  
/*! @abstract Concatenates `x`, `y` and `zw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double x, double y, double2 zw) {
 return ::simd_make_double4(x, y, zw);
}
  
/*! @abstract Concatenates `x`, `yz` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double x, double2 yz, double w) {
 return ::simd_make_double4(x, yz, w);
}
  
/*! @abstract Concatenates `xy`, `z` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double2 xy, double z, double w) {
 return ::simd_make_double4(xy, z, w);
}
  
/*! @abstract Concatenates `x` and `yzw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double x, double3 yzw) {
 return ::simd_make_double4(x, yzw);
}
  
/*! @abstract Concatenates `xy` and `zw` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double2 xy, double2 zw) {
 return ::simd_make_double4(xy, zw);
}
  
/*! @abstract Concatenates `xyz` and `w` to form a vector of four 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double4 make_double4(double3 xyz, double w) {
 return ::simd_make_double4(xyz, w);
}
  
/*! @abstract Truncates or zero-extends `other` to form a vector of four
 *  64-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC double4 make_double4(typeN other) {
  return ::simd_make_double4(other);
}
  
/*! @abstract Extends `other` to form a vector of four 64-bit floating-point
 *  numbers. The contents of the newly-created vector lanes are unspecified.  */
template <typename typeN> static SIMD_CPPFUNC double4 make_double4_undef(typeN other) {
  return ::simd_make_double4_undef(other);
}

/*! @abstract Concatenates `lo` and `hi` to form a vector of eight 64-bit
 *  floating-point numbers.                                                   */
static inline SIMD_CPPFUNC double8 make_double8(double4 lo, double4 hi) {
 return ::simd_make_double8(lo, hi);
}

/*! @abstract Truncates or zero-extends `other` to form a vector of eight
 *  64-bit floating-point numbers.                                            */
template <typename typeN> static SIMD_CPPFUNC double8 make_double8(typeN other) {
  return ::simd_make_double8(other);
}
  
/*! @abstract Extends `other` to form a vector of eight 64-bit floating-
 *  point numbers. The contents of the newly-created vector lanes are
 *  unspecified.                                                              */
template <typename typeN> static SIMD_CPPFUNC double8 make_double8_undef(typeN other) {
  return ::simd_make_double8_undef(other);
}

/*! @struct Vector
 *  @abstract Templated Vector struct based on scalar type and number of
 *  elements
 *  @field count Number of elements in the vector
 *  @field scalar_t The scalar type of each element
 *  @field type The inferred simd::typeN type
 *  @field packed_t The inferred simd::packed::typeN type
 *  @field mask_t The return type of comparison operations                    */
template <typename ScalarType, size_t count> struct Vector {
  //  static const size_t count
  //  typedef scalar_t
  //  typedef type
  //  typedef packed_t
  //  typedef mask_t
};
/*! @abstract Helper type to access the simd type easily.                     */
template <typename ScalarType, size_t count>
using Vector_t = typename Vector<ScalarType, count>::type;

/*! @abstract Look up the equivalent Vector struct according to the simd
 *  type.                                                                     */
template <typename typeN> struct get_traits
{
//    using type = Vector<ScalarType, count>;
};
/*! @abstract Helper type to access the Vector struct easily.
 *  @discussion This is commonly used to query the type traits of a simd
 *  type.
 *  For example, simd::traits<simd::float4>::count is 4.                      */
template<typename typeN>
using traits = typename get_traits<typeN>::type;

template<> struct Vector<char1, 1> {
  static const size_t count = 1;
  typedef char1 scalar_t;
  typedef char1 type;
  typedef char1 mask_t;
};

template <> struct get_traits<char1>
{
    using type = Vector<char1, 1>;
};

template<> struct Vector<char1, 2> {
  static const size_t count = 2;
  typedef char1 scalar_t;
  typedef char2 type;
  typedef packed::char2 packed_t;
  typedef char2 mask_t;
};

template <> struct get_traits<char2>
{
    using type = Vector<char1, 2>;
};

template<> struct Vector<char1, 3> {
  static const size_t count = 3;
  typedef char1 scalar_t;
  typedef char3 type;
  typedef char3 mask_t;
};

template <> struct get_traits<char3>
{
    using type = Vector<char1, 3>;
};

template<> struct Vector<char1, 4> {
  static const size_t count = 4;
  typedef char1 scalar_t;
  typedef char4 type;
  typedef packed::char4 packed_t;
  typedef char4 mask_t;
};

template <> struct get_traits<char4>
{
    using type = Vector<char1, 4>;
};

template<> struct Vector<char1, 8> {
  static const size_t count = 8;
  typedef char1 scalar_t;
  typedef char8 type;
  typedef packed::char8 packed_t;
  typedef char8 mask_t;
};

template <> struct get_traits<char8>
{
    using type = Vector<char1, 8>;
};

template<> struct Vector<char1, 16> {
  static const size_t count = 16;
  typedef char1 scalar_t;
  typedef char16 type;
  typedef packed::char16 packed_t;
  typedef char16 mask_t;
};

template <> struct get_traits<char16>
{
    using type = Vector<char1, 16>;
};

template<> struct Vector<char1, 32> {
  static const size_t count = 32;
  typedef char1 scalar_t;
  typedef char32 type;
  typedef packed::char32 packed_t;
  typedef char32 mask_t;
};

template <> struct get_traits<char32>
{
    using type = Vector<char1, 32>;
};

template<> struct Vector<char1, 64> {
  static const size_t count = 64;
  typedef char1 scalar_t;
  typedef char64 type;
  typedef packed::char64 packed_t;
  typedef char64 mask_t;
};

template <> struct get_traits<char64>
{
    using type = Vector<char1, 64>;
};

template<> struct Vector<uchar1, 1> {
  static const size_t count = 1;
  typedef uchar1 scalar_t;
  typedef uchar1 type;
  typedef char1 mask_t;
};

template <> struct get_traits<uchar1>
{
    using type = Vector<uchar1, 1>;
};

template<> struct Vector<uchar1, 2> {
  static const size_t count = 2;
  typedef uchar1 scalar_t;
  typedef uchar2 type;
  typedef packed::uchar2 packed_t;
  typedef char2 mask_t;
};

template <> struct get_traits<uchar2>
{
    using type = Vector<uchar1, 2>;
};

template<> struct Vector<uchar1, 3> {
  static const size_t count = 3;
  typedef uchar1 scalar_t;
  typedef uchar3 type;
  typedef char3 mask_t;
};

template <> struct get_traits<uchar3>
{
    using type = Vector<uchar1, 3>;
};

template<> struct Vector<uchar1, 4> {
  static const size_t count = 4;
  typedef uchar1 scalar_t;
  typedef uchar4 type;
  typedef packed::uchar4 packed_t;
  typedef char4 mask_t;
};

template <> struct get_traits<uchar4>
{
    using type = Vector<uchar1, 4>;
};

template<> struct Vector<uchar1, 8> {
  static const size_t count = 8;
  typedef uchar1 scalar_t;
  typedef uchar8 type;
  typedef packed::uchar8 packed_t;
  typedef char8 mask_t;
};

template <> struct get_traits<uchar8>
{
    using type = Vector<uchar1, 8>;
};

template<> struct Vector<uchar1, 16> {
  static const size_t count = 16;
  typedef uchar1 scalar_t;
  typedef uchar16 type;
  typedef packed::uchar16 packed_t;
  typedef char16 mask_t;
};

template <> struct get_traits<uchar16>
{
    using type = Vector<uchar1, 16>;
};

template<> struct Vector<uchar1, 32> {
  static const size_t count = 32;
  typedef uchar1 scalar_t;
  typedef uchar32 type;
  typedef packed::uchar32 packed_t;
  typedef char32 mask_t;
};

template <> struct get_traits<uchar32>
{
    using type = Vector<uchar1, 32>;
};

template<> struct Vector<uchar1, 64> {
  static const size_t count = 64;
  typedef uchar1 scalar_t;
  typedef uchar64 type;
  typedef packed::uchar64 packed_t;
  typedef char64 mask_t;
};

template <> struct get_traits<uchar64>
{
    using type = Vector<uchar1, 64>;
};

template<> struct Vector<short1, 1> {
  static const size_t count = 1;
  typedef short1 scalar_t;
  typedef short1 type;
  typedef short1 mask_t;
};

template <> struct get_traits<short1>
{
    using type = Vector<short1, 1>;
};

template<> struct Vector<short1, 2> {
  static const size_t count = 2;
  typedef short1 scalar_t;
  typedef short2 type;
  typedef packed::short2 packed_t;
  typedef short2 mask_t;
};

template <> struct get_traits<short2>
{
    using type = Vector<short1, 2>;
};

template<> struct Vector<short1, 3> {
  static const size_t count = 3;
  typedef short1 scalar_t;
  typedef short3 type;
  typedef short3 mask_t;
};

template <> struct get_traits<short3>
{
    using type = Vector<short1, 3>;
};

template<> struct Vector<short1, 4> {
  static const size_t count = 4;
  typedef short1 scalar_t;
  typedef short4 type;
  typedef packed::short4 packed_t;
  typedef short4 mask_t;
};

template <> struct get_traits<short4>
{
    using type = Vector<short1, 4>;
};

template<> struct Vector<short1, 8> {
  static const size_t count = 8;
  typedef short1 scalar_t;
  typedef short8 type;
  typedef packed::short8 packed_t;
  typedef short8 mask_t;
};

template <> struct get_traits<short8>
{
    using type = Vector<short1, 8>;
};

template<> struct Vector<short1, 16> {
  static const size_t count = 16;
  typedef short1 scalar_t;
  typedef short16 type;
  typedef packed::short16 packed_t;
  typedef short16 mask_t;
};

template <> struct get_traits<short16>
{
    using type = Vector<short1, 16>;
};

template<> struct Vector<short1, 32> {
  static const size_t count = 32;
  typedef short1 scalar_t;
  typedef short32 type;
  typedef packed::short32 packed_t;
  typedef short32 mask_t;
};

template <> struct get_traits<short32>
{
    using type = Vector<short1, 32>;
};

template<> struct Vector<ushort1, 1> {
  static const size_t count = 1;
  typedef ushort1 scalar_t;
  typedef ushort1 type;
  typedef short1 mask_t;
};

template <> struct get_traits<ushort1>
{
    using type = Vector<ushort1, 1>;
};

template<> struct Vector<ushort1, 2> {
  static const size_t count = 2;
  typedef ushort1 scalar_t;
  typedef ushort2 type;
  typedef packed::ushort2 packed_t;
  typedef short2 mask_t;
};

template <> struct get_traits<ushort2>
{
    using type = Vector<ushort1, 2>;
};

template<> struct Vector<ushort1, 3> {
  static const size_t count = 3;
  typedef ushort1 scalar_t;
  typedef ushort3 type;
  typedef short3 mask_t;
};

template <> struct get_traits<ushort3>
{
    using type = Vector<ushort1, 3>;
};

template<> struct Vector<ushort1, 4> {
  static const size_t count = 4;
  typedef ushort1 scalar_t;
  typedef ushort4 type;
  typedef packed::ushort4 packed_t;
  typedef short4 mask_t;
};

template <> struct get_traits<ushort4>
{
    using type = Vector<ushort1, 4>;
};

template<> struct Vector<ushort1, 8> {
  static const size_t count = 8;
  typedef ushort1 scalar_t;
  typedef ushort8 type;
  typedef packed::ushort8 packed_t;
  typedef short8 mask_t;
};

template <> struct get_traits<ushort8>
{
    using type = Vector<ushort1, 8>;
};

template<> struct Vector<ushort1, 16> {
  static const size_t count = 16;
  typedef ushort1 scalar_t;
  typedef ushort16 type;
  typedef packed::ushort16 packed_t;
  typedef short16 mask_t;
};

template <> struct get_traits<ushort16>
{
    using type = Vector<ushort1, 16>;
};

template<> struct Vector<ushort1, 32> {
  static const size_t count = 32;
  typedef ushort1 scalar_t;
  typedef ushort32 type;
  typedef packed::ushort32 packed_t;
  typedef short32 mask_t;
};

template <> struct get_traits<ushort32>
{
    using type = Vector<ushort1, 32>;
};

template<> struct Vector<int1, 1> {
  static const size_t count = 1;
  typedef int1 scalar_t;
  typedef int1 type;
  typedef int1 mask_t;
};

template <> struct get_traits<int1>
{
    using type = Vector<int1, 1>;
};

template<> struct Vector<int1, 2> {
  static const size_t count = 2;
  typedef int1 scalar_t;
  typedef int2 type;
  typedef packed::int2 packed_t;
  typedef int2 mask_t;
};

template <> struct get_traits<int2>
{
    using type = Vector<int1, 2>;
};

template<> struct Vector<int1, 3> {
  static const size_t count = 3;
  typedef int1 scalar_t;
  typedef int3 type;
  typedef int3 mask_t;
};

template <> struct get_traits<int3>
{
    using type = Vector<int1, 3>;
};

template<> struct Vector<int1, 4> {
  static const size_t count = 4;
  typedef int1 scalar_t;
  typedef int4 type;
  typedef packed::int4 packed_t;
  typedef int4 mask_t;
};

template <> struct get_traits<int4>
{
    using type = Vector<int1, 4>;
};

template<> struct Vector<int1, 8> {
  static const size_t count = 8;
  typedef int1 scalar_t;
  typedef int8 type;
  typedef packed::int8 packed_t;
  typedef int8 mask_t;
};

template <> struct get_traits<int8>
{
    using type = Vector<int1, 8>;
};

template<> struct Vector<int1, 16> {
  static const size_t count = 16;
  typedef int1 scalar_t;
  typedef int16 type;
  typedef packed::int16 packed_t;
  typedef int16 mask_t;
};

template <> struct get_traits<int16>
{
    using type = Vector<int1, 16>;
};

template<> struct Vector<uint1, 1> {
  static const size_t count = 1;
  typedef uint1 scalar_t;
  typedef uint1 type;
  typedef int1 mask_t;
};

template <> struct get_traits<uint1>
{
    using type = Vector<uint1, 1>;
};

template<> struct Vector<uint1, 2> {
  static const size_t count = 2;
  typedef uint1 scalar_t;
  typedef uint2 type;
  typedef packed::uint2 packed_t;
  typedef int2 mask_t;
};

template <> struct get_traits<uint2>
{
    using type = Vector<uint1, 2>;
};

template<> struct Vector<uint1, 3> {
  static const size_t count = 3;
  typedef uint1 scalar_t;
  typedef uint3 type;
  typedef int3 mask_t;
};

template <> struct get_traits<uint3>
{
    using type = Vector<uint1, 3>;
};

template<> struct Vector<uint1, 4> {
  static const size_t count = 4;
  typedef uint1 scalar_t;
  typedef uint4 type;
  typedef packed::uint4 packed_t;
  typedef int4 mask_t;
};

template <> struct get_traits<uint4>
{
    using type = Vector<uint1, 4>;
};

template<> struct Vector<uint1, 8> {
  static const size_t count = 8;
  typedef uint1 scalar_t;
  typedef uint8 type;
  typedef packed::uint8 packed_t;
  typedef int8 mask_t;
};

template <> struct get_traits<uint8>
{
    using type = Vector<uint1, 8>;
};

template<> struct Vector<uint1, 16> {
  static const size_t count = 16;
  typedef uint1 scalar_t;
  typedef uint16 type;
  typedef packed::uint16 packed_t;
  typedef int16 mask_t;
};

template <> struct get_traits<uint16>
{
    using type = Vector<uint1, 16>;
};

template<> struct Vector<float1, 1> {
  static const size_t count = 1;
  typedef float1 scalar_t;
  typedef float1 type;
  typedef int1 mask_t;
};

template <> struct get_traits<float1>
{
    using type = Vector<float1, 1>;
};

template<> struct Vector<float1, 2> {
  static const size_t count = 2;
  typedef float1 scalar_t;
  typedef float2 type;
  typedef packed::float2 packed_t;
  typedef int2 mask_t;
};

template <> struct get_traits<float2>
{
    using type = Vector<float1, 2>;
};

template<> struct Vector<float1, 3> {
  static const size_t count = 3;
  typedef float1 scalar_t;
  typedef float3 type;
  typedef int3 mask_t;
};

template <> struct get_traits<float3>
{
    using type = Vector<float1, 3>;
};

template<> struct Vector<float1, 4> {
  static const size_t count = 4;
  typedef float1 scalar_t;
  typedef float4 type;
  typedef packed::float4 packed_t;
  typedef int4 mask_t;
};

template <> struct get_traits<float4>
{
    using type = Vector<float1, 4>;
};

template<> struct Vector<float1, 8> {
  static const size_t count = 8;
  typedef float1 scalar_t;
  typedef float8 type;
  typedef packed::float8 packed_t;
  typedef int8 mask_t;
};

template <> struct get_traits<float8>
{
    using type = Vector<float1, 8>;
};

template<> struct Vector<float1, 16> {
  static const size_t count = 16;
  typedef float1 scalar_t;
  typedef float16 type;
  typedef packed::float16 packed_t;
  typedef int16 mask_t;
};

template <> struct get_traits<float16>
{
    using type = Vector<float1, 16>;
};

template<> struct Vector<long1, 1> {
  static const size_t count = 1;
  typedef long1 scalar_t;
  typedef long1 type;
  typedef long1 mask_t;
};

template <> struct get_traits<long1>
{
    using type = Vector<long1, 1>;
};

template<> struct Vector<long1, 2> {
  static const size_t count = 2;
  typedef long1 scalar_t;
  typedef long2 type;
  typedef packed::long2 packed_t;
  typedef long2 mask_t;
};

template <> struct get_traits<long2>
{
    using type = Vector<long1, 2>;
};

template<> struct Vector<long1, 3> {
  static const size_t count = 3;
  typedef long1 scalar_t;
  typedef long3 type;
  typedef long3 mask_t;
};

template <> struct get_traits<long3>
{
    using type = Vector<long1, 3>;
};

template<> struct Vector<long1, 4> {
  static const size_t count = 4;
  typedef long1 scalar_t;
  typedef long4 type;
  typedef packed::long4 packed_t;
  typedef long4 mask_t;
};

template <> struct get_traits<long4>
{
    using type = Vector<long1, 4>;
};

template<> struct Vector<long1, 8> {
  static const size_t count = 8;
  typedef long1 scalar_t;
  typedef long8 type;
  typedef packed::long8 packed_t;
  typedef long8 mask_t;
};

template <> struct get_traits<long8>
{
    using type = Vector<long1, 8>;
};

template<> struct Vector<ulong1, 1> {
  static const size_t count = 1;
  typedef ulong1 scalar_t;
  typedef ulong1 type;
  typedef long1 mask_t;
};

template <> struct get_traits<ulong1>
{
    using type = Vector<ulong1, 1>;
};

template<> struct Vector<ulong1, 2> {
  static const size_t count = 2;
  typedef ulong1 scalar_t;
  typedef ulong2 type;
  typedef packed::ulong2 packed_t;
  typedef long2 mask_t;
};

template <> struct get_traits<ulong2>
{
    using type = Vector<ulong1, 2>;
};

template<> struct Vector<ulong1, 3> {
  static const size_t count = 3;
  typedef ulong1 scalar_t;
  typedef ulong3 type;
  typedef long3 mask_t;
};

template <> struct get_traits<ulong3>
{
    using type = Vector<ulong1, 3>;
};

template<> struct Vector<ulong1, 4> {
  static const size_t count = 4;
  typedef ulong1 scalar_t;
  typedef ulong4 type;
  typedef packed::ulong4 packed_t;
  typedef long4 mask_t;
};

template <> struct get_traits<ulong4>
{
    using type = Vector<ulong1, 4>;
};

template<> struct Vector<ulong1, 8> {
  static const size_t count = 8;
  typedef ulong1 scalar_t;
  typedef ulong8 type;
  typedef packed::ulong8 packed_t;
  typedef long8 mask_t;
};

template <> struct get_traits<ulong8>
{
    using type = Vector<ulong1, 8>;
};

template<> struct Vector<double1, 1> {
  static const size_t count = 1;
  typedef double1 scalar_t;
  typedef double1 type;
  typedef long1 mask_t;
};

template <> struct get_traits<double1>
{
    using type = Vector<double1, 1>;
};

template<> struct Vector<double1, 2> {
  static const size_t count = 2;
  typedef double1 scalar_t;
  typedef double2 type;
  typedef packed::double2 packed_t;
  typedef long2 mask_t;
};

template <> struct get_traits<double2>
{
    using type = Vector<double1, 2>;
};

template<> struct Vector<double1, 3> {
  static const size_t count = 3;
  typedef double1 scalar_t;
  typedef double3 type;
  typedef long3 mask_t;
};

template <> struct get_traits<double3>
{
    using type = Vector<double1, 3>;
};

template<> struct Vector<double1, 4> {
  static const size_t count = 4;
  typedef double1 scalar_t;
  typedef double4 type;
  typedef packed::double4 packed_t;
  typedef long4 mask_t;
};

template <> struct get_traits<double4>
{
    using type = Vector<double1, 4>;
};

template<> struct Vector<double1, 8> {
  static const size_t count = 8;
  typedef double1 scalar_t;
  typedef double8 type;
  typedef packed::double8 packed_t;
  typedef long8 mask_t;
};

template <> struct get_traits<double8>
{
    using type = Vector<double1, 8>;
};

#if __has_feature(cxx_constexpr)
/*! @abstract Templated make function based on return type and argument
 *  type.                                                                     */
template<typename typeN, typename... Args>
static constexpr typeN make(Args... args)
{
    if constexpr (traits<typeN>::count == 1)
    {
        using FirstArgType = typename std::tuple_element<0, std::tuple<Args...>>::type;
        if constexpr (std::is_same<FirstArgType, typename traits<FirstArgType>::scalar_t>::value)
            return typeN(std::get<0>(std::make_tuple(args...)));
        else
            return typeN(std::get<0>(std::make_tuple(args...))[0]);
    }
    else if constexpr (std::is_same<typeN, char2>::value)
        return make_char2(args...);
    else if constexpr (std::is_same<typeN, char3>::value)
        return make_char3(args...);
    else if constexpr (std::is_same<typeN, char4>::value)
        return make_char4(args...);
    else if constexpr (std::is_same<typeN, char8>::value)
        return make_char8(args...);
    else if constexpr (std::is_same<typeN, char16>::value)
        return make_char16(args...);
    else if constexpr (std::is_same<typeN, char32>::value)
        return make_char32(args...);
    else if constexpr (std::is_same<typeN, char64>::value)
        return make_char64(args...);
    else if constexpr (std::is_same<typeN, uchar2>::value)
        return make_uchar2(args...);
    else if constexpr (std::is_same<typeN, uchar3>::value)
        return make_uchar3(args...);
    else if constexpr (std::is_same<typeN, uchar4>::value)
        return make_uchar4(args...);
    else if constexpr (std::is_same<typeN, uchar8>::value)
        return make_uchar8(args...);
    else if constexpr (std::is_same<typeN, uchar16>::value)
        return make_uchar16(args...);
    else if constexpr (std::is_same<typeN, uchar32>::value)
        return make_uchar32(args...);
    else if constexpr (std::is_same<typeN, uchar64>::value)
        return make_uchar64(args...);
    else if constexpr (std::is_same<typeN, short2>::value)
        return make_short2(args...);
    else if constexpr (std::is_same<typeN, short3>::value)
        return make_short3(args...);
    else if constexpr (std::is_same<typeN, short4>::value)
        return make_short4(args...);
    else if constexpr (std::is_same<typeN, short8>::value)
        return make_short8(args...);
    else if constexpr (std::is_same<typeN, short16>::value)
        return make_short16(args...);
    else if constexpr (std::is_same<typeN, short32>::value)
        return make_short32(args...);
    else if constexpr (std::is_same<typeN, ushort2>::value)
        return make_ushort2(args...);
    else if constexpr (std::is_same<typeN, ushort3>::value)
        return make_ushort3(args...);
    else if constexpr (std::is_same<typeN, ushort4>::value)
        return make_ushort4(args...);
    else if constexpr (std::is_same<typeN, ushort8>::value)
        return make_ushort8(args...);
    else if constexpr (std::is_same<typeN, ushort16>::value)
        return make_ushort16(args...);
    else if constexpr (std::is_same<typeN, ushort32>::value)
        return make_ushort32(args...);
    else if constexpr (std::is_same<typeN, int2>::value)
        return make_int2(args...);
    else if constexpr (std::is_same<typeN, int3>::value)
        return make_int3(args...);
    else if constexpr (std::is_same<typeN, int4>::value)
        return make_int4(args...);
    else if constexpr (std::is_same<typeN, int8>::value)
        return make_int8(args...);
    else if constexpr (std::is_same<typeN, int16>::value)
        return make_int16(args...);
    else if constexpr (std::is_same<typeN, uint2>::value)
        return make_uint2(args...);
    else if constexpr (std::is_same<typeN, uint3>::value)
        return make_uint3(args...);
    else if constexpr (std::is_same<typeN, uint4>::value)
        return make_uint4(args...);
    else if constexpr (std::is_same<typeN, uint8>::value)
        return make_uint8(args...);
    else if constexpr (std::is_same<typeN, uint16>::value)
        return make_uint16(args...);
    else if constexpr (std::is_same<typeN, float2>::value)
        return make_float2(args...);
    else if constexpr (std::is_same<typeN, float3>::value)
        return make_float3(args...);
    else if constexpr (std::is_same<typeN, float4>::value)
        return make_float4(args...);
    else if constexpr (std::is_same<typeN, float8>::value)
        return make_float8(args...);
    else if constexpr (std::is_same<typeN, float16>::value)
        return make_float16(args...);
    else if constexpr (std::is_same<typeN, long2>::value)
        return make_long2(args...);
    else if constexpr (std::is_same<typeN, long3>::value)
        return make_long3(args...);
    else if constexpr (std::is_same<typeN, long4>::value)
        return make_long4(args...);
    else if constexpr (std::is_same<typeN, long8>::value)
        return make_long8(args...);
    else if constexpr (std::is_same<typeN, ulong2>::value)
        return make_ulong2(args...);
    else if constexpr (std::is_same<typeN, ulong3>::value)
        return make_ulong3(args...);
    else if constexpr (std::is_same<typeN, ulong4>::value)
        return make_ulong4(args...);
    else if constexpr (std::is_same<typeN, ulong8>::value)
        return make_ulong8(args...);
    else if constexpr (std::is_same<typeN, double2>::value)
        return make_double2(args...);
    else if constexpr (std::is_same<typeN, double3>::value)
        return make_double3(args...);
    else if constexpr (std::is_same<typeN, double4>::value)
        return make_double4(args...);
    else if constexpr (std::is_same<typeN, double8>::value)
        return make_double8(args...);
}

/*! @abstract Templated make_undef function based on return type and
 *  argument type.                                                            */
template<typename typeN, typename... Args>
static constexpr typeN make_undef(Args... args)
{
    if constexpr (traits<typeN>::count == 1)
    {
        using FirstArgType = typename std::tuple_element<0, std::tuple<Args...>>::type;
        if constexpr (std::is_same<FirstArgType, typename traits<FirstArgType>::scalar_t>::value)
            return typeN(std::get<0>(std::make_tuple(args...)));
        else
            return typeN(std::get<0>(std::make_tuple(args...))[0]);
    }
    else if constexpr (std::is_same<typeN, char2>::value)
        return make_char2_undef(args...);
    else if constexpr (std::is_same<typeN, char3>::value)
        return make_char3_undef(args...);
    else if constexpr (std::is_same<typeN, char4>::value)
        return make_char4_undef(args...);
    else if constexpr (std::is_same<typeN, char8>::value)
        return make_char8_undef(args...);
    else if constexpr (std::is_same<typeN, char16>::value)
        return make_char16_undef(args...);
    else if constexpr (std::is_same<typeN, char32>::value)
        return make_char32_undef(args...);
    else if constexpr (std::is_same<typeN, char64>::value)
        return make_char64_undef(args...);
    else if constexpr (std::is_same<typeN, uchar2>::value)
        return make_uchar2_undef(args...);
    else if constexpr (std::is_same<typeN, uchar3>::value)
        return make_uchar3_undef(args...);
    else if constexpr (std::is_same<typeN, uchar4>::value)
        return make_uchar4_undef(args...);
    else if constexpr (std::is_same<typeN, uchar8>::value)
        return make_uchar8_undef(args...);
    else if constexpr (std::is_same<typeN, uchar16>::value)
        return make_uchar16_undef(args...);
    else if constexpr (std::is_same<typeN, uchar32>::value)
        return make_uchar32_undef(args...);
    else if constexpr (std::is_same<typeN, uchar64>::value)
        return make_uchar64_undef(args...);
    else if constexpr (std::is_same<typeN, short2>::value)
        return make_short2_undef(args...);
    else if constexpr (std::is_same<typeN, short3>::value)
        return make_short3_undef(args...);
    else if constexpr (std::is_same<typeN, short4>::value)
        return make_short4_undef(args...);
    else if constexpr (std::is_same<typeN, short8>::value)
        return make_short8_undef(args...);
    else if constexpr (std::is_same<typeN, short16>::value)
        return make_short16_undef(args...);
    else if constexpr (std::is_same<typeN, short32>::value)
        return make_short32_undef(args...);
    else if constexpr (std::is_same<typeN, ushort2>::value)
        return make_ushort2_undef(args...);
    else if constexpr (std::is_same<typeN, ushort3>::value)
        return make_ushort3_undef(args...);
    else if constexpr (std::is_same<typeN, ushort4>::value)
        return make_ushort4_undef(args...);
    else if constexpr (std::is_same<typeN, ushort8>::value)
        return make_ushort8_undef(args...);
    else if constexpr (std::is_same<typeN, ushort16>::value)
        return make_ushort16_undef(args...);
    else if constexpr (std::is_same<typeN, ushort32>::value)
        return make_ushort32_undef(args...);
    else if constexpr (std::is_same<typeN, int2>::value)
        return make_int2_undef(args...);
    else if constexpr (std::is_same<typeN, int3>::value)
        return make_int3_undef(args...);
    else if constexpr (std::is_same<typeN, int4>::value)
        return make_int4_undef(args...);
    else if constexpr (std::is_same<typeN, int8>::value)
        return make_int8_undef(args...);
    else if constexpr (std::is_same<typeN, int16>::value)
        return make_int16_undef(args...);
    else if constexpr (std::is_same<typeN, uint2>::value)
        return make_uint2_undef(args...);
    else if constexpr (std::is_same<typeN, uint3>::value)
        return make_uint3_undef(args...);
    else if constexpr (std::is_same<typeN, uint4>::value)
        return make_uint4_undef(args...);
    else if constexpr (std::is_same<typeN, uint8>::value)
        return make_uint8_undef(args...);
    else if constexpr (std::is_same<typeN, uint16>::value)
        return make_uint16_undef(args...);
    else if constexpr (std::is_same<typeN, float2>::value)
        return make_float2_undef(args...);
    else if constexpr (std::is_same<typeN, float3>::value)
        return make_float3_undef(args...);
    else if constexpr (std::is_same<typeN, float4>::value)
        return make_float4_undef(args...);
    else if constexpr (std::is_same<typeN, float8>::value)
        return make_float8_undef(args...);
    else if constexpr (std::is_same<typeN, float16>::value)
        return make_float16_undef(args...);
    else if constexpr (std::is_same<typeN, long2>::value)
        return make_long2_undef(args...);
    else if constexpr (std::is_same<typeN, long3>::value)
        return make_long3_undef(args...);
    else if constexpr (std::is_same<typeN, long4>::value)
        return make_long4_undef(args...);
    else if constexpr (std::is_same<typeN, long8>::value)
        return make_long8_undef(args...);
    else if constexpr (std::is_same<typeN, ulong2>::value)
        return make_ulong2_undef(args...);
    else if constexpr (std::is_same<typeN, ulong3>::value)
        return make_ulong3_undef(args...);
    else if constexpr (std::is_same<typeN, ulong4>::value)
        return make_ulong4_undef(args...);
    else if constexpr (std::is_same<typeN, ulong8>::value)
        return make_ulong8_undef(args...);
    else if constexpr (std::is_same<typeN, double2>::value)
        return make_double2_undef(args...);
    else if constexpr (std::is_same<typeN, double3>::value)
        return make_double3_undef(args...);
    else if constexpr (std::is_same<typeN, double4>::value)
        return make_double4_undef(args...);
    else if constexpr (std::is_same<typeN, double8>::value)
        return make_double8_undef(args...);
}
#endif /* __has_feature(cxx_constexpr) */
} /* namespace simd */
#endif /* __cplusplus */
#endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */
#endif /* SIMD_VECTOR_CONSTRUCTORS */
