目次

ターゲットプラットフォーム:

include/AK/SoundEngine/Platforms/Generic/AkSimd.h

ソースコードを見る。

構成

struct   AKSIMD_V4I32
struct   AKSIMD_V4UI32
struct   AKSIMD_V2F32
struct   AKSIMD_V4F32
struct   AKSIMD_V4I32_UNALIGNED
struct   AKSIMD_V4UI32_UNALIGNED
struct   AKSIMD_V2F32_UNALIGNED
struct   AKSIMD_V4F32_UNALIGNED

マクロ定義

#define  AKSIMD_GETELEMENT_V4F32(__vName, __num__)   (__vName).m_data[(__num__)]
#define  AKSIMD_GETELEMENT_V2F32(__vName, __num__)   (__vName).m_data[(__num__)]
#define  AKSIMD_GETELEMENT_V4I32(__vName, __num__)   (__vName).m_data[(__num__)]
#define  AkReal32Vector   AKSIMD_V4F32
#define  AKSIMD_LOAD1(__scalar__)   AKSIMD_LOAD1_V4F32( &__scalar__ )
#define  AKSIMD_LOADVEC(v)   AKSIMD_LOAD_V4F32((const AKSIMD_F32*)((v)))
#define  AKSIMD_MUL   AKSIMD_MUL_V4F32
#define  AKSIMD_STOREVEC   AKSIMD_STORE_V4F32
#define  AKSIMD_SPLAT_V4F32(var, idx)   AKSIMD_SHUFFLE_V4F32(var,var, AKSIMD_SHUFFLE(idx,idx,idx,idx))
#define  AK_SIGN_BIT(val)   (((AkUInt32)val) >> 31)
Platform specific memory size alignment for allocation purposes

#define  AKSIMD_ALIGNSIZE(__Size__)   (((__Size__) + 15) & ~15)

型定義

AKSIMD types

typedef AkInt32  AKSIMD_I32
  32-bit signed integer
typedef AkReal32  AKSIMD_F32
  32-bit float
typedef AKSIMD_V4UI32  AKSIMD_V4COND
  Vector of 4 comparison results.

関数

static AkForceInline void  AKSIMD_HORIZONTALADD (AKSIMD_V4F32 &vVec)
static AkForceInline AKSIMD_V4F32  AKSIMD_COMPLEXMUL (const AKSIMD_V4F32 vCIn1, const AKSIMD_V4F32 vCIn2)
  Cross-platform SIMD multiplication of 2 complex data elements with interleaved real and imaginary parts.
static AkForceInline int  AKSIMD_MASK_V4F32 (const AKSIMD_V4F32 &in_vec)
AKSIMD conversion

AkForceInline AKSIMD_V4F32  AKSIMD_CONVERT_V4I32_TO_V4F32 (const AKSIMD_V4I32 &in_from)
AkForceInline AKSIMD_V4I32  AKSIMD_CONVERT_V4F32_TO_V4I32 (const AKSIMD_V4F32 &in_from)
AKSIMD logical operations

AkForceInline AKSIMD_V4I32  AKSIMD_AND_V4I32 (const AKSIMD_V4I32 &in_vec1, const AKSIMD_V4I32 &in_vec2)
AkForceInline AKSIMD_V4I32  AKSIMD_CMPGT_V8I16 (const AKSIMD_V4I32 &in_vec1, const AKSIMD_V4I32 &in_vec2)
AkForceInline AKSIMD_V4UI32  AKSIMD_CMPLE_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
  Compares for less than or equal (see _mm_cmple_ps).
AkForceInline AKSIMD_V4F32  AKSIMD_GTEQ_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_GT_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_LTEQ_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_LT_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_EQ_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_XOR_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4I32  AKSIMD_SHIFTLEFT_V4I32 (AKSIMD_V4I32 in_vector, int in_shiftBy)
AkForceInline AKSIMD_V4I32  AKSIMD_SHIFTRIGHTARITH_V4I32 (AKSIMD_V4I32 in_vector, int in_shiftBy)
AKSIMD packing / unpacking

AkForceInline AKSIMD_V4I32  AKSIMD_UNPACKLO_VECTOR8I16 (const AKSIMD_V4I32 &in_vec1, const AKSIMD_V4I32 &in_vec2)
AkForceInline AKSIMD_V4I32  AKSIMD_UNPACKHI_VECTOR8I16 (const AKSIMD_V4I32 &in_vec1, const AKSIMD_V4I32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_UNPACKLO_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_UNPACKHI_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4I32  AKSIMD_PACKS_V4I32 (const AKSIMD_V4I32 &in_vec1, const AKSIMD_V4I32 &in_vec2)

AKSIMD loading / setting



#define  AKSIMD_LOADU_V4I32(in_pData)   (*(in_pData))
#define  AKSIMD_LOADU_V4F32(in_pValue)   (*(AKSIMD_V4F32*)(in_pValue))
#define  AKSIMD_LOAD_V4F32(in_pValue)   (*(AKSIMD_V4F32*)(in_pValue))
AkForceInline AKSIMD_V4F32  AKSIMD_LOAD1_V4F32 (AKSIMD_F32 in_value)
AkForceInline AKSIMD_V4F32  AKSIMD_SET_V4F32 (AKSIMD_F32 in_value)
AkForceInline AKSIMD_V2F32  AKSIMD_SET_V2F32 (AKSIMD_F32 in_value)
AkForceInline AKSIMD_V4F32  AKSIMD_SETZERO_V4F32 ()
AkForceInline AKSIMD_V2F32  AKSIMD_SETZERO_V2F32 ()
AkForceInline AKSIMD_V4I32  AKSIMD_SETZERO_V4I32 ()
AkForceInline AKSIMD_V4F32  AKSIMD_LOAD_SS_V4F32 (const AKSIMD_F32 *in_pData)

AKSIMD storing



#define  AKSIMD_STOREU_V4F32(in_pTo, in_vec)   (*(AKSIMD_V4F32*)(in_pTo)) = (in_vec)
#define  AKSIMD_STORE_V4F32(__addr__, __vName__)   AKSIMD_STOREU_V4F32(__addr__, __vName__)
#define  AKSIMD_STOREU_V4I32(in_pTo, in_vec)   (*(AKSIMD_V4I32*)(in_pTo)) = (in_vec)
AkForceInline void  AKSIMD_STORE1_V4F32 (AKSIMD_F32 *in_pTo, const AKSIMD_V4F32 &in_vec)

AKSIMD arithmetic



#define  AKSIMD_MADD_V4F32(__a__, __b__, __c__)   AKSIMD_ADD_V4F32( AKSIMD_MUL_V4F32( (__a__), (__b__) ), (__c__) )
  Vector multiply-add operation.
#define  AKSIMD_MSUB_V4F32(__a__, __b__, __c__)   AKSIMD_SUB_V4F32( AKSIMD_MUL_V4F32( (__a__), (__b__) ), (__c__) )
#define  AKSIMD_MADD_SS_V4F32(__a__, __b__, __c__)   AKSIMD_ADD_SS_V4F32( AKSIMD_MUL_SS_V4F32( (__a__), (__b__) ), (__c__) )
  Vector multiply-add operation.
AkForceInline AKSIMD_V4F32  AKSIMD_SUB_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_SUB_SS_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_ADD_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_DIV_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V2F32  AKSIMD_ADD_V2F32 (const AKSIMD_V2F32 &in_vec1, const AKSIMD_V2F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_ADD_SS_V4F32 (const AKSIMD_V4F32 &a, const AKSIMD_V4F32 &b)
AkForceInline AKSIMD_V4F32  AKSIMD_MUL_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V2F32  AKSIMD_MUL_V2F32 (const AKSIMD_V2F32 &in_vec1, const AKSIMD_V2F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_MUL_SS_V4F32 (const AKSIMD_V4F32 &a, const AKSIMD_V4F32 &b)
AkForceInline AKSIMD_V4F32  AKSIMD_MIN_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V2F32  AKSIMD_MIN_V2F32 (const AKSIMD_V2F32 &in_vec1, const AKSIMD_V2F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_MAX_V4F32 (const AKSIMD_V4F32 &in_vec1, const AKSIMD_V4F32 &in_vec2)
AkForceInline AKSIMD_V2F32  AKSIMD_MAX_V2F32 (const AKSIMD_V2F32 &in_vec1, const AKSIMD_V2F32 &in_vec2)
AkForceInline AKSIMD_V4F32  AKSIMD_ABS_V4F32 (const AKSIMD_V4F32 &in_vec1)
AkForceInline AKSIMD_V4F32  AKSIMD_NEG_V4F32 (const AKSIMD_V4F32 &in_vec1)
AkForceInline AKSIMD_V4F32  AKSIMD_SQRT_V4F32 (const AKSIMD_V4F32 &in_vec)
AkForceInline AKSIMD_V4F32  AKSIMD_RSQRT_V4F32 (const AKSIMD_V4F32 &in_vec)
  Vector reciprocal square root approximation 1/sqrt(a), or equivalently, sqrt(1/a).
AkForceInline AKSIMD_V2F32  AKSIMD_SQRT_V2F32 (const AKSIMD_V2F32 &in_vec)

AKSIMD shuffling



#define  AKSIMD_SHUFFLE(fp3, fp2, fp1, fp0)   (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))
#define  AKSIMD_MOVEHL_V4F32(a, b)   AKSIMD_SHUFFLE_V4F32( (b), (a), AKSIMD_SHUFFLE(3, 2, 3, 2) )
#define  AKSIMD_MOVELH_V4F32(a, b)   AKSIMD_SHUFFLE_V4F32( (a), (b), AKSIMD_SHUFFLE(1, 0, 1, 0) )
#define  AKSIMD_SHUFFLE_BADC(__a__)   AKSIMD_SHUFFLE_V4F32( (__a__), (__a__), AKSIMD_SHUFFLE(2,3,0,1));
  Swap the 2 lower floats together and the 2 higher floats together.
#define  AKSIMD_SHUFFLE_CDAB(__a__)   AKSIMD_SHUFFLE_V4F32( (__a__), (__a__), AKSIMD_SHUFFLE(1,0,3,2));
  Swap the 2 lower floats with the 2 higher floats.
#define  AKSIMD_SHUFFLE_BCDA(__a__)   AKSIMD_SHUFFLE_V4F32( (__a__), (__a__), AKSIMD_SHUFFLE(0,3,2,1))
  Barrel-shift all floats by one.
#define  AKSIMD_DUP_ODD(__vv)   AKSIMD_SHUFFLE_V4F32(__vv, __vv, AKSIMD_SHUFFLE(3,3,1,1))
  Duplicates the odd items into the even items (d c b a -> d d b b ).
#define  AKSIMD_DUP_EVEN(__vv)   AKSIMD_SHUFFLE_V4F32(__vv, __vv, AKSIMD_SHUFFLE(2,2,0,0))
  Duplicates the even items into the odd items (d c b a -> c c a a ).
AkForceInline AKSIMD_V4F32  AKSIMD_SHUFFLE_V4F32 (const AKSIMD_V4F32 &xyzw, const AKSIMD_V4F32 &abcd, int mask)

説明

AKSIMD - Generic (no SIMD support) implementation

AkSimd.h で定義されています。