42#if SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64
43#define SYMCRYPT_SCSTABLE_USE64 1
44#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE 32
45#define SYMCRYPT_SCSTABLE_GROUP_SIZE 4
48#define SYMCRYPT_SCSTABLE_USE64 0
49#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE 16
50#define SYMCRYPT_SCSTABLE_GROUP_SIZE 4
67#pragma warning( suppress: 4127 )
82 SYMCRYPT_ASSERT( elementSize % interleaveSize == 0 && nElements % groupSize == 0 && (elementSize | nElements) < (1 << 16) && elementSize > 0 );
86 pScsTable->groupSize = groupSize;
87 pScsTable->interleaveSize = interleaveSize;
88 pScsTable->nElements = nElements;
89 pScsTable->elementSize = elementSize;
91 pScsTable->pbTableData =
NULL;
106 pScsTable->pbTableData = pbBuffer;
124 UINT32 elementSize = pScsTable->elementSize;
135 groupOffset = iIndex % groupSize;
141 UINT32 nInterleaves = elementSize / interleaveSize;
150 pDst += interleaveSize * groupSize /
sizeof( *pDst );
151 pSrc += interleaveSize /
sizeof( *pSrc );
153 }
while( nInterleaves > 0 );
157#if SYMCRYPT_CPU_AMD64
160SymCryptScsTableStore128Xmm(
166 __m128i * pDst = (__m128i *) (pScsTable->pbTableData + iIndex * 128);
167 __m128i * pSrc = (__m128i *)
pbData;
169 SYMCRYPT_ASSERT(
cbData == 128 && pScsTable->elementSize == 128 && iIndex < pScsTable->nElements && pScsTable->groupSize == 1 );
193 UINT32 elementSize = pScsTable->elementSize;
198 UINT32 nElements = pScsTable->nElements;
204 UINT32 nInterleaves = elementSize / interleaveSize;
214#if SYMCRYPT_SCSTABLE_USE64
215#define SCS_MASK_EQUAL32( _a, _b ) ( ~(UINT64) ((INT64) ((UINT64)0 - (_a ^ _b)) >> 32 ) )
217#define SCS_MASK_EQUAL32( _a, _b ) (SYMCRYPT_MASK32_EQ( _a, _b ))
231 pD[0] = (mask0 & pSrc[0]) | (mask1 & pSrc[4]) | (mask2 & pSrc[ 8]) | (mask3 & pSrc[12]);
232 pD[1] = (mask0 & pSrc[1]) | (mask1 & pSrc[5]) | (mask2 & pSrc[ 9]) | (mask3 & pSrc[13]);
233 pD[2] = (mask0 & pSrc[2]) | (mask1 & pSrc[6]) | (mask2 & pSrc[10]) | (mask3 & pSrc[14]);
234 pD[3] = (mask0 & pSrc[3]) | (mask1 & pSrc[7]) | (mask2 & pSrc[11]) | (mask3 & pSrc[15]);
235 pD += interleaveSize /
sizeof( *pD );
236 pSrc += interleaveSize * groupSize /
sizeof( *pSrc );
242 while (
i + groupSize <= nElements)
254 pD[0] |= (mask0 & pSrc[0]) | (mask1 & pSrc[4]) | (mask2 & pSrc[ 8]) | (mask3 & pSrc[12]);
255 pD[1] |= (mask0 & pSrc[1]) | (mask1 & pSrc[5]) | (mask2 & pSrc[ 9]) | (mask3 & pSrc[13]);
256 pD[2] |= (mask0 & pSrc[2]) | (mask1 & pSrc[6]) | (mask2 & pSrc[10]) | (mask3 & pSrc[14]);
257 pD[3] |= (mask0 & pSrc[3]) | (mask1 & pSrc[7]) | (mask2 & pSrc[11]) | (mask3 & pSrc[15]);
258 pD += interleaveSize /
sizeof( *pD );
259 pSrc += interleaveSize * groupSize /
sizeof( *pSrc );
267#if SYMCRYPT_CPU_AMD64
270SymCryptScsTableLoad128Xmm(
276 UINT32 nElements = pScsTable->nElements;
285 __m128i * pSrc = (__m128i *) pScsTable->pbTableData;
286 __m128i * pDst = (__m128i *)
pbData;
288 SYMCRYPT_ASSERT(
cbData == 128 && pScsTable->elementSize == 128 && iIndex < pScsTable->nElements && pScsTable->groupSize == 1 );
305 while( --nElements > 0 )
340#if SYMCRYPT_CPU_AMD64
342 if( pScsTable->elementSize == 128 )
344 SymCryptScsTableStore128Xmm( pScsTable, iIndex,
pbData,
cbData );
366#if SYMCRYPT_CPU_AMD64
368 if( pScsTable->elementSize == 128 )
370 SymCryptScsTableLoad128Xmm( pScsTable, iIndex,
pbData,
cbData );
387 SymCryptWipe( pScsTable->pbTableData, pScsTable->cbTableData );
#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE
VOID SYMCRYPT_CALL SymCryptScsTableLoadC(_In_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _Out_writes_bytes_(cbData) PBYTE pbData, UINT32 cbData)
UINT32 SYMCRYPT_CALL SymCryptScsTableInit(_Out_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 nElements, UINT32 elementSize)
UINT32 SYMCRYPT_SCSTABLE_TYPE
VOID SYMCRYPT_CALL SymCryptScsTableSetBuffer(_Inout_ PSYMCRYPT_SCSTABLE pScsTable, _Inout_updates_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer)
VOID SYMCRYPT_CALL SymCryptScsTableStore(_Inout_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _In_reads_bytes_(cbData) PCBYTE pbData, UINT32 cbData)
VOID SYMCRYPT_CALL SymCryptScsTableStoreC(_Inout_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _In_reads_bytes_(cbData) PCBYTE pbData, UINT32 cbData)
#define SCS_MASK_EQUAL32(_a, _b)
VOID SYMCRYPT_CALL SymCryptScsTableWipe(_Inout_ PSYMCRYPT_SCSTABLE pScsTable)
VOID SYMCRYPT_CALL SymCryptScsTableLoad(_In_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _Out_writes_bytes_(cbData) PBYTE pbData, UINT32 cbData)
#define SYMCRYPT_SCSTABLE_GROUP_SIZE
COMPILER_DEPENDENT_UINT64 UINT64
__m128i _mm_set_epi32(int i3, int i2, int i1, int i0)
__m128i _mm_setzero_si128(void)
__m128i _mm_or_si128(__m128i a, __m128i b)
__m128i _mm_cmpeq_epi32(__m128i a, __m128i b)
__m128i _mm_and_si128(__m128i a, __m128i b)
__m128i _mm_add_epi32(__m128i a, __m128i b)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define _In_reads_bytes_(s)
#define _Inout_updates_bytes_(s)
#define _Out_writes_bytes_(s)
#define UNREFERENCED_PARAMETER(P)
#define R1(v, w, x, y, z, i)
#define R2(v, w, x, y, z, i)
#define R0(v, w, x, y, z, i)
#define R3(v, w, x, y, z, i)
#define R4(v, w, x, y, z, i)
#define SYMCRYPT_ASSERT(_x)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_CPU_AMD64
PCBYTE PBYTE SIZE_T cbData