#ifdef _MSC_VER #pragma once #endif #ifndef SSC_INTRIN #define SSC_INTRIN #include "StgSharpC.h" #include typedef union column_2 { __m256 stream[1]; __m128 column[2]; float m[4][2]; } __2_columnset; typedef struct column_3 { __m256 part; __m128 column[3]; float m[4][3]; } __3_columnset; typedef union column_4 { __m512 stream; __m256 half[2]; __m128 column[4]; float m[4][4]; } __4_columnset; typedef void (SSCDECL *VECTORNORMALIZEPROC)(__m128 *source, __m128 *target); typedef void (SSCDECL *MATRIXTRANSPOSEPROC)(void *source, void *target); typedef void (SSCDECL *MATRIXDETPROC)(void *mat, void *transpose); typedef void (SSCDECL *MATARITHMETIC)(void* left, void* right, void* ans); typedef void (SSCDECL *SCALERMATARITHMETIC)(void* left, void* right, void* ans); #pragma region matix function INTERNAL void normalize(__m128 *source, __m128 *target); INTERNAL void SSCDECL addmatrix2_sse(__2_columnset* left, __2_columnset* right, __2_columnset* ans); INTERNAL void SSCDECL addmatrix2_avx(__2_columnset* left, __2_columnset* right, __2_columnset* ans); INTERNAL void SSCDECL transpose23(__2_columnset *source, __3_columnset *target); INTERNAL void SSCDECL transpose24(__2_columnset *source, __4_columnset *target); INTERNAL void SSCDECL addmatrix3_sse(__3_columnset* left, __3_columnset* right, __3_columnset* ans); INTERNAL void SSCDECL addmatrix3_avx(__3_columnset* left, __3_columnset* right, __3_columnset* ans); INTERNAL void SSCDECL addmatrix3_512(__3_columnset* left, __3_columnset* right, __3_columnset* ans); INTERNAL void SSCDECL transpose32(__3_columnset *source, __2_columnset *target); INTERNAL void SSCDECL transpose33(__3_columnset *source, __3_columnset *target); INTERNAL void SSCDECL transpose34(__3_columnset *source, __4_columnset *target); INTERNAL float SSCDECL det_mat3(__3_columnset *matrix, __3_columnset *tranpose); INTERNAL void SSCDECL transpose42(__4_columnset *source, __2_columnset *target); INTERNAL void SSCDECL transpose43(__4_columnset *source, __3_columnset *target); INTERNAL void SSCDECL transpose44(__4_columnset *matrix, __4_columnset *target); INTERNAL float SSCDECL det_mat4(__4_columnset *matrix, __4_columnset *transpose); #pragma endregion #pragma region quick_hash INTERNAL int quick_string_hash(byte *str, int length); #pragma endregion typedef struct ssc_intrinsic { MATARITHMETIC add_m2; MATARITHMETIC add_m3; MATARITHMETIC add_m4; MATRIXDETPROC det_matrix33; MATRIXDETPROC det_matrix44; VECTORNORMALIZEPROC normalize_3; int (*string_quick_hash)(char *str, int length); MATRIXTRANSPOSEPROC transpose_23; MATRIXTRANSPOSEPROC transpose_24; MATRIXTRANSPOSEPROC transpose_32; MATRIXTRANSPOSEPROC transpose_33; MATRIXTRANSPOSEPROC transpose_34; MATRIXTRANSPOSEPROC transpose_42; MATRIXTRANSPOSEPROC transpose_43; MATRIXTRANSPOSEPROC transpose_44; } ssc_intrinsic; enum most_advance_instruction { SSE, AVX, AVX512, NEON }; #endif // !SSC_INTRIN