daily update on 20241226 by nitload youmu
This commit is contained in:
@@ -41,6 +41,7 @@ extern "C" {
|
||||
|
||||
#define ALIGN(simdVec) _mm_loadu_ps(&simdVec)
|
||||
#define ALIGN256(simdVec) _mm256_loadu_ps(&simdVec)
|
||||
#define ALIGN512(simdVec) _mm512_loadu_ps(&simdVec)
|
||||
|
||||
typedef struct Image {
|
||||
int width;
|
||||
|
||||
@@ -73,10 +73,10 @@
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>$(SolutionDir)</OutDir>
|
||||
<OutDir>$(SolutionDir)build</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>$(SolutionDir)</OutDir>
|
||||
<OutDir>$(SolutionDir)build</OutDir>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
@@ -119,6 +119,7 @@
|
||||
<ExpandAttributedSource>true</ExpandAttributedSource>
|
||||
<AssemblerOutput>All</AssemblerOutput>
|
||||
<BrowseInformation>true</BrowseInformation>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
@@ -138,16 +139,17 @@
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<AssemblerOutput>AssemblyAndMachineCode</AssemblerOutput>
|
||||
<AssemblerOutput>NoListing</AssemblerOutput>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
<LanguageStandard_C>stdc17</LanguageStandard_C>
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<AdditionalDependencies>opengl32.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ShowProgress>LinkVerbose</ShowProgress>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// dllmain.cpp : 定义 DLL 应用程序的入口点。
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "ssc_framework.h"
|
||||
#endif // __
|
||||
@@ -35,6 +34,6 @@ attribute((constructor)) void DllMain()
|
||||
{
|
||||
}
|
||||
|
||||
// clang-format on
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
// clang-format on
|
||||
|
||||
+82
-20
@@ -2,14 +2,42 @@
|
||||
#include "ssc_intrinsic.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#include <isa_availability.h>
|
||||
#else
|
||||
#else
|
||||
#include <cpuid.h>
|
||||
#endif // _MSC_VER
|
||||
|
||||
PRIVATE void load_intrinsic_sse(ssc_intrinsic* context);
|
||||
PRIVATE void load_intrinsic_sse(ssc_intrinsic *context);
|
||||
PRIVATE void load_intrinsic_avx(ssc_intrinsic *context);
|
||||
PRIVATE void load_intrinsic_512(ssc_intrinsic *context);
|
||||
|
||||
PRIVATE int check_isa(most_advanced_instruction instruction_family)
|
||||
{
|
||||
if (instruction_family != NEON) {
|
||||
#if _MSC_VER
|
||||
return __check_isa_support(instruction_family, 0);
|
||||
#else
|
||||
switch (instruction_family) {
|
||||
case SSE:
|
||||
return __builtin_cpu_supports("sse4.2");
|
||||
case AVX256:
|
||||
return __builtin_cpu_supports("avx2");
|
||||
case AVX512:
|
||||
return __builtin_cpu_supports("avx512f");
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
#endif // _MSC_VER
|
||||
}
|
||||
|
||||
#if defined(__ARM_NEON) || defined(__ARM_NEON__)
|
||||
return 1;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
SSCAPI int load_intrinsic_function(void *intrinsic_context)
|
||||
{
|
||||
@@ -17,31 +45,65 @@ SSCAPI int load_intrinsic_function(void *intrinsic_context)
|
||||
|
||||
ssc_intrinsic *context = (ssc_intrinsic *)intrinsic_context;
|
||||
|
||||
if (__check_isa_support(__IA_SUPPORT_VECTOR512,0))
|
||||
{
|
||||
|
||||
}
|
||||
else if (__check_isa_support(__IA_SUPPORT_VECTOR256, 0))
|
||||
{
|
||||
|
||||
}
|
||||
else if (__check_isa_support(__IA_SUPPORT_SSE42, 0))
|
||||
{
|
||||
if (check_isa(AVX512)) {
|
||||
load_intrinsic_512(context);
|
||||
return 3;
|
||||
} else if (check_isa(AVX256)) {
|
||||
load_intrinsic_avx(context);
|
||||
return 2;
|
||||
} else if (check_isa(SSE)) {
|
||||
load_intrinsic_sse(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
return 1;
|
||||
} else if (check_isa(NEON)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void load_intrinsic_sse(ssc_intrinsic* context)
|
||||
void load_intrinsic_sse(ssc_intrinsic *context)
|
||||
{
|
||||
context->add_m2 = addmatrix2_sse;
|
||||
context->add_m3 = ;
|
||||
context->add_m4 = ;
|
||||
context->add_m3 = addmatrix3_sse;
|
||||
context->add_m4 = addmatrix4_sse;
|
||||
context->transpose_23 = transpose23;
|
||||
context->transpose_24 = transpose24;
|
||||
context->transpose_32 = transpose32;
|
||||
context->transpose_33 = transpose33;
|
||||
context->transpose_34 = transpose34;
|
||||
context->transpose_42 = transpose42;
|
||||
context->transpose_43 = transpose43;
|
||||
context->transpose_44 = transpose44;
|
||||
context->normalize_3 = normalize;
|
||||
context->det_matrix33 = det_mat3;
|
||||
context->det_matrix44 = det_mat4;
|
||||
context->string_quick_hash = quick_string_hash;
|
||||
}
|
||||
|
||||
void load_intrinsic_avx(ssc_intrinsic *context)
|
||||
{
|
||||
context->add_m2 = addmatrix2_avx;
|
||||
context->add_m3 = addmatrix3_avx;
|
||||
context->add_m4 = addmatrix4_avx;
|
||||
context->transpose_23 = transpose23;
|
||||
context->transpose_24 = transpose24;
|
||||
context->transpose_32 = transpose32;
|
||||
context->transpose_33 = transpose33;
|
||||
context->transpose_34 = transpose34;
|
||||
context->transpose_42 = transpose42;
|
||||
context->transpose_43 = transpose43;
|
||||
context->transpose_44 = transpose44;
|
||||
context->normalize_3 = normalize;
|
||||
context->det_matrix33 = det_mat3;
|
||||
context->det_matrix44 = det_mat4;
|
||||
context->string_quick_hash = quick_string_hash;
|
||||
}
|
||||
|
||||
void load_intrinsic_512(ssc_intrinsic *context)
|
||||
{
|
||||
context->add_m2 = addmatrix2_avx;
|
||||
context->add_m3 = addmatrix3_512;
|
||||
context->add_m4 = addmatrix4_512;
|
||||
context->transpose_23 = transpose23;
|
||||
context->transpose_24 = transpose24;
|
||||
context->transpose_32 = transpose32;
|
||||
|
||||
+15
-28
@@ -1,45 +1,32 @@
|
||||
#include "StgSharpC.h"
|
||||
#include "ssc_intrinsic.h"
|
||||
|
||||
INTERNAL void __cdecl transpose23(__2_columnset *source,
|
||||
__3_columnset *target)
|
||||
INTERNAL void __cdecl transpose23(__2_columnset *source, __3_columnset *target)
|
||||
{
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
|
||||
target->column[0] =
|
||||
_mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] =
|
||||
_mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[2] =
|
||||
_mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[0] = _mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] = _mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[2] = _mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
}
|
||||
|
||||
INTERNAL void __cdecl transpose24(__2_columnset *source,
|
||||
__4_columnset *target)
|
||||
INTERNAL void __cdecl transpose24(__2_columnset *source, __4_columnset *target)
|
||||
{
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
|
||||
target->column[0] =
|
||||
_mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] =
|
||||
_mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[2] =
|
||||
_mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[3] =
|
||||
_mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[0] = _mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] = _mm_shuffle_ps(t0, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[2] = _mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[3] = _mm_shuffle_ps(t1, zeroVec, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
}
|
||||
|
||||
INTERNAL void __cdecl addmatrix2_sse(__2_columnset* left, __2_columnset* right, __2_columnset* ans)
|
||||
INTERNAL void __cdecl addmatrix2_sse(__2_columnset *left, __2_columnset *right, __2_columnset *ans)
|
||||
{
|
||||
__m128 temp0 = _mm_add_ps(ALIGN(left->column[0]), ALIGN(right->column[0]));
|
||||
__m128 temp1 = _mm_add_ps(ALIGN(left->column[1]), ALIGN(right->column[1]));
|
||||
@@ -48,7 +35,7 @@ INTERNAL void __cdecl addmatrix2_sse(__2_columnset* left, __2_columnset* right,
|
||||
_mm_storeu_ps(&ans->m[0][1], temp1);
|
||||
}
|
||||
|
||||
INTERNAL void __cdecl addmatrix2_avx(__2_columnset* left, __2_columnset* right, __2_columnset* ans)
|
||||
INTERNAL void __cdecl addmatrix2_avx(__2_columnset *left, __2_columnset *right, __2_columnset *ans)
|
||||
{
|
||||
__m256 temp = _mm256_add_ps(ALIGN256(left->column[0]), ALIGN256(right->column[0]));
|
||||
_mm256_storeu_ps(&ans->m[0][0], temp);
|
||||
|
||||
+21
-37
@@ -2,51 +2,38 @@
|
||||
#include "ssc_intrinsic.h"
|
||||
#include <stdio.h>
|
||||
|
||||
INTERNAL void _cdecl transpose32(__3_columnset *source,
|
||||
__2_columnset *target)
|
||||
INTERNAL void _cdecl transpose32(__3_columnset *source, __2_columnset *target)
|
||||
{
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec,
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec, _MM_SHUFFLE(1, 0, 1, 0));
|
||||
|
||||
target->column[0] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
}
|
||||
|
||||
INTERNAL void _cdecl transpose33(__3_columnset *source,
|
||||
__3_columnset *target)
|
||||
INTERNAL void _cdecl transpose33(__3_columnset *source, __3_columnset *target)
|
||||
{
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec,
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t3 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec,
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec, _MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t3 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec, _MM_SHUFFLE(3, 2, 3, 2));
|
||||
|
||||
target->column[0] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
target->column[2] = _mm_shuffle_ps(t1, t3, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
}
|
||||
|
||||
INTERNAL void _cdecl transpose34(__3_columnset *source,
|
||||
__4_columnset *target)
|
||||
INTERNAL void _cdecl transpose34(__3_columnset *source, __4_columnset *target)
|
||||
{
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
__m128 t0 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]),
|
||||
ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec,
|
||||
_MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t3 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec,
|
||||
__m128 t1 = _mm_shuffle_ps(ALIGN(source->column[0]), ALIGN(source->column[1]),
|
||||
_MM_SHUFFLE(3, 2, 3, 2));
|
||||
__m128 t2 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec, _MM_SHUFFLE(1, 0, 1, 0));
|
||||
__m128 t3 = _mm_shuffle_ps(ALIGN(source->column[2]), zeroVec, _MM_SHUFFLE(3, 2, 3, 2));
|
||||
|
||||
target->column[0] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
target->column[1] = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
@@ -54,9 +41,7 @@ INTERNAL void _cdecl transpose34(__3_columnset *source,
|
||||
target->column[3] = _mm_shuffle_ps(t1, t3, _MM_SHUFFLE(3, 1, 3, 1));
|
||||
}
|
||||
|
||||
INTERNAL float _cdecl det_mat3_internal(__m128 const c0,
|
||||
__m128 const c1,
|
||||
__m128 const c2)
|
||||
INTERNAL float _cdecl det_mat3_internal(__m128 const c0, __m128 const c1, __m128 const c2)
|
||||
{
|
||||
//let adding row aligned
|
||||
__m128 addc1 = _mm_shuffle_ps(c1, c1, _MM_SHUFFLE(3, 0, 2, 1));
|
||||
@@ -83,16 +68,14 @@ INTERNAL float _cdecl det_mat3_internal(__m128 const c0,
|
||||
return ret.m128_f32[2];
|
||||
}
|
||||
|
||||
INTERNAL float _cdecl det_mat3(__3_columnset *source,
|
||||
__3_columnset *transpose)
|
||||
INTERNAL float _cdecl det_mat3(__3_columnset *source, __3_columnset *transpose)
|
||||
{
|
||||
return det_mat3_internal(source->column[0], source->column[1],
|
||||
source->column[2]);
|
||||
return det_mat3_internal(source->column[0], source->column[1], source->column[2]);
|
||||
}
|
||||
|
||||
#pragma region add
|
||||
|
||||
INTERNAL void __cdecl addmatrix3_sse(__3_columnset* left, __3_columnset* right, __3_columnset* ans)
|
||||
INTERNAL void __cdecl addmatrix3_sse(__3_columnset *left, __3_columnset *right, __3_columnset *ans)
|
||||
{
|
||||
__m128 temp0 = _mm_add_ps(ALIGN(left->column[0]), ALIGN(right->column[0]));
|
||||
__m128 temp1 = _mm_add_ps(ALIGN(left->column[1]), ALIGN(right->column[1]));
|
||||
@@ -103,7 +86,7 @@ INTERNAL void __cdecl addmatrix3_sse(__3_columnset* left, __3_columnset* right,
|
||||
_mm_storeu_ps(&ans->m[0][2], temp2);
|
||||
}
|
||||
|
||||
INTERNAL void __cdecl addmatrix3_sse(__3_columnset* left, __3_columnset* right, __3_columnset* ans)
|
||||
INTERNAL void __cdecl addmatrix3_avx(__3_columnset *left, __3_columnset *right, __3_columnset *ans)
|
||||
{
|
||||
__m256 temp0 = _mm256_add_ps(ALIGN256(left->part), ALIGN256(right->part));
|
||||
__m128 temp1 = _mm_add_ps(ALIGN(left->column[2]), ALIGN(right->column[2]));
|
||||
@@ -112,9 +95,10 @@ INTERNAL void __cdecl addmatrix3_sse(__3_columnset* left, __3_columnset* right,
|
||||
_mm_storeu_ps(&ans->m[0][2], temp1);
|
||||
}
|
||||
|
||||
INTERNAL void __cdecl addmatrix3_sse(__3_columnset* left, __3_columnset* right, __3_columnset* ans)
|
||||
INTERNAL void __cdecl addmatrix3_512(__3_columnset *left, __3_columnset *right, __3_columnset *ans)
|
||||
{
|
||||
__m512
|
||||
__m512 temp = _mm512_add_ps(_mm512_loadu_ps(left), _mm512_loadu_ps(right));
|
||||
_mm512_mask_store_ps(ans, 0x0fff, temp);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
@@ -74,3 +74,22 @@ INTERNAL float __cdecl det_mat4(__4_columnset const *mat_ptr, __4_columnset cons
|
||||
retvec = _mm_hadd_ps(retvec, retvec);
|
||||
return -retvec.m128_f32[0];
|
||||
}
|
||||
|
||||
INTERNAL void SSCDECL addmatrix4_sse(__4_columnset *left, __4_columnset *right, __4_columnset *ans)
|
||||
{
|
||||
ans->column[0] = _mm_add_ps(ALIGN(left->column[0]), ALIGN(right->column[0]));
|
||||
ans->column[1] = _mm_add_ps(ALIGN(left->column[1]), ALIGN(right->column[1]));
|
||||
ans->column[2] = _mm_add_ps(ALIGN(left->column[2]), ALIGN(right->column[2]));
|
||||
ans->column[3] = _mm_add_ps(ALIGN(left->column[3]), ALIGN(right->column[3]));
|
||||
}
|
||||
|
||||
INTERNAL void SSCDECL addmatrix4_avx(__4_columnset *left, __4_columnset *right, __4_columnset *ans)
|
||||
{
|
||||
ans->half[0] = _mm256_add_ps(ALIGN256(left->half[0]), ALIGN256(right->half[0]));
|
||||
ans->half[1] = _mm256_add_ps(ALIGN256(left->half[1]), ALIGN256(right->half[1]));
|
||||
}
|
||||
|
||||
INTERNAL void SSCDECL addmatrix4_512(__4_columnset *left, __4_columnset *right, __4_columnset *ans)
|
||||
{
|
||||
ans->stream = _mm512_add_ps(ALIGN512(left->stream), ALIGN512(right->stream));
|
||||
}
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
#include "StgSharpC.h"
|
||||
#include <immintrin.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#include <isa_availability.h>
|
||||
#endif
|
||||
|
||||
typedef union column_2 {
|
||||
__m256 stream[1];
|
||||
__m128 column[2];
|
||||
@@ -39,21 +44,24 @@ 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 transpose23(__2_columnset const *source, __3_columnset *target);
|
||||
INTERNAL void SSCDECL transpose24(__2_columnset const *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 void SSCDECL transpose32(__3_columnset const *source, __2_columnset *target);
|
||||
INTERNAL void SSCDECL transpose33(__3_columnset const *source, __3_columnset *target);
|
||||
INTERNAL void SSCDECL transpose34(__3_columnset const *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 void SSCDECL addmatrix4_sse(__4_columnset *left, __4_columnset *right, __4_columnset *ans);
|
||||
INTERNAL void SSCDECL addmatrix4_avx(__4_columnset *left, __4_columnset *right, __4_columnset *ans);
|
||||
INTERNAL void SSCDECL addmatrix4_512(__4_columnset *left, __4_columnset *right, __4_columnset *ans);
|
||||
INTERNAL void SSCDECL transpose42(__4_columnset const *source, __2_columnset *target);
|
||||
INTERNAL void SSCDECL transpose43(__4_columnset const *source, __3_columnset *target);
|
||||
INTERNAL void SSCDECL transpose44(__4_columnset const *source, __4_columnset *target);
|
||||
INTERNAL float SSCDECL det_mat4(__4_columnset *matrix, __4_columnset *transpose);
|
||||
|
||||
#pragma endregion
|
||||
@@ -82,12 +90,19 @@ typedef struct ssc_intrinsic {
|
||||
MATRIXTRANSPOSEPROC transpose_44;
|
||||
} ssc_intrinsic;
|
||||
|
||||
enum most_advance_instruction
|
||||
typedef enum most_advanced_instruction
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
SSE = __IA_SUPPORT_SSE42,
|
||||
AVX256 = __IA_SUPPORT_VECTOR256,
|
||||
AVX512 = __IA_SUPPORT_VECTOR512,
|
||||
NEON
|
||||
#else
|
||||
SSE,
|
||||
AVX,
|
||||
AVX256,
|
||||
AVX512,
|
||||
NEON
|
||||
};
|
||||
#endif
|
||||
}most_advanced_instruction;
|
||||
|
||||
#endif // !SSC_INTRIN
|
||||
|
||||
Reference in New Issue
Block a user