Skip to content

Commit

Permalink
Updated CMake and test code to build on WSL ARM64 (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
walbourn committed Sep 18, 2021
1 parent 5658db5 commit 79d393e
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 72 deletions.
157 changes: 90 additions & 67 deletions CMakeLists.txt
Expand Up @@ -23,19 +23,21 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/CMake")

include_directories(../Inc)

if (${CMAKE_SIZEOF_VOID_P} EQUAL "4")
set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
else()
set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
endif()
if (NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
if (${CMAKE_SIZEOF_VOID_P} EQUAL "4")
set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
else()
set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
endif()

set(ARCH_AVX $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mavx>)
set(ARCH_AVX2 $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mavx2 -mfma -mf16c>)
set(ARCH_F16C $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mf16c>)
set(ARCH_FMA $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mfma>)
set(ARCH_FMA4 $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mfma4>)
set(ARCH_SSE3 $<$<CXX_COMPILER_ID:MSVC>:${ARCH_SSE2}> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse3>)
set(ARCH_SSSE3 $<$<CXX_COMPILER_ID:MSVC>:${ARCH_SSE2}> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>)
set(ARCH_AVX $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mavx>)
set(ARCH_AVX2 $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mavx2 -mfma -mf16c>)
set(ARCH_F16C $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mf16c>)
set(ARCH_FMA $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mfma>)
set(ARCH_FMA4 $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mfma4>)
set(ARCH_SSE3 $<$<CXX_COMPILER_ID:MSVC>:${ARCH_SSE2}> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse3>)
set(ARCH_SSSE3 $<$<CXX_COMPILER_ID:MSVC>:${ARCH_SSE2}> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>)
endif()

if(BUILD_DISABLE_SVML)
set(DXMATH_DEFS _XM_DISABLE_INTEL_SVML_)
Expand Down Expand Up @@ -110,8 +112,6 @@ elseif ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
add_compile_options(/permissive- /Zc:__cplusplus /wd4514 /wd4710 /wd4820 /wd4668 /wd5039 /wd5045)
endif()

add_executable(cpuid cpuid/cpuid.cpp)

add_executable(math3
math3/box.cpp
math3/constexpr.cpp
Expand All @@ -129,13 +129,69 @@ add_executable(math3
math3/xmvec234.cpp)
target_compile_options(math3 PRIVATE ${ARCH_SSE2})
target_compile_definitions(math3 PRIVATE ${DXMATH_DEFS})
source_group(Math3 REGULAR_EXPRESSION math3/*.*)

add_executable(shmathtest
shmath/test.cpp
../SHMath/DirectXSH.cpp
../SHMath/DirectXSH.h)
target_compile_options(shmathtest PRIVATE ${ARCH_SSE2})
target_compile_definitions(shmathtest PRIVATE ${DXMATH_DEFS})
target_compile_definitions(shmathtest PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( shmathtest PUBLIC ../SHMath )
source_group(shmathtest REGULAR_EXPRESSION shmath/*.*)

add_executable(xdsptest xdsp/Test.cpp)
target_compile_definitions(xdsptest PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( xdsptest PUBLIC ../XDSP )
source_group(XDSPTest REGULAR_EXPRESSION xdsp/*.*)

if (WIN32)
target_compile_definitions(math3 PRIVATE _UNICODE UNICODE)

add_executable(cpuid cpuid/cpuid.cpp)
source_group(cpuid REGULAR_EXPRESSION cpuid/*.*)
source_group(Ext REGULAR_EXPRESSION ext/*.*)

add_executable(testavx ext/testavx.cpp)
target_compile_options(testavx PRIVATE ${ARCH_AVX})
target_compile_definitions(testavx PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testavx PUBLIC ../Extensions )

add_executable(testavx2 ext/testavx2.cpp)
target_compile_options(testavx2 PRIVATE ${ARCH_AVX2})
target_compile_definitions(testavx2 PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testavx2 PUBLIC ../Extensions )

add_executable(testbe ext/testbe.cpp)
target_compile_options(testbe PRIVATE ${ARCH_SSSE3})
target_compile_definitions(testbe PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testbe PUBLIC ../Extensions )

add_executable(testf16c ext/testf16c.cpp)
target_compile_options(testf16c PRIVATE ${ARCH_F16C})
target_compile_definitions(testf16c PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testf16c PUBLIC ../Extensions )

add_executable(testfma3 ext/testfma3.cpp)
target_compile_options(testfma3 PRIVATE ${ARCH_FMA})
target_compile_definitions(testfma3 PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testfma3 PUBLIC ../Extensions )

add_executable(testfma4 ext/testfma4.cpp)
target_compile_options(testfma4 PRIVATE ${ARCH_FMA4})
target_compile_definitions(testfma4 PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testfma4 PUBLIC ../Extensions )

add_executable(testsse3 ext/testsse3.cpp)
target_compile_options(testsse3 PRIVATE ${ARCH_SSE3})
target_compile_definitions(testsse3 PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testsse3 PUBLIC ../Extensions )

add_executable(testsse4 ext/testsse4.cpp)
target_compile_options(testsse4 PRIVATE ${ARCH_SSE4})
target_compile_definitions(testsse4 PRIVATE ${DXMATH_DEFS} _UNICODE UNICODE)
target_include_directories( testsse4 PUBLIC ../Extensions )
endif()

if (WIN32 AND NOT MINGW)

Expand All @@ -160,58 +216,6 @@ if (WIN32 AND NOT MINGW)
target_link_libraries(shmathtest d3d12.lib)
endif()

add_executable(testavx ext/testavx.cpp)
target_compile_options(testavx PRIVATE ${ARCH_AVX})
target_compile_definitions(testavx PRIVATE ${DXMATH_DEFS})

add_executable(testavx2 ext/testavx2.cpp)
target_compile_options(testavx2 PRIVATE ${ARCH_AVX2})
target_compile_definitions(testavx2 PRIVATE ${DXMATH_DEFS})

add_executable(testbe ext/testbe.cpp)
target_compile_options(testbe PRIVATE ${ARCH_SSSE3})
target_compile_definitions(testbe PRIVATE ${DXMATH_DEFS})

add_executable(testf16c ext/testf16c.cpp)
target_compile_options(testf16c PRIVATE ${ARCH_F16C})
target_compile_definitions(testf16c PRIVATE ${DXMATH_DEFS})

add_executable(testfma3 ext/testfma3.cpp)
target_compile_options(testfma3 PRIVATE ${ARCH_FMA})
target_compile_definitions(testfma3 PRIVATE ${DXMATH_DEFS})

add_executable(testfma4 ext/testfma4.cpp)
target_compile_options(testfma4 PRIVATE ${ARCH_FMA4})
target_compile_definitions(testfma4 PRIVATE ${DXMATH_DEFS})

add_executable(testsse3 ext/testsse3.cpp)
target_compile_options(testsse3 PRIVATE ${ARCH_SSE3})
target_compile_definitions(testsse3 PRIVATE ${DXMATH_DEFS})

add_executable(testsse4 ext/testsse4.cpp)
target_compile_options(testsse4 PRIVATE ${ARCH_SSE4})
target_compile_definitions(testsse4 PRIVATE ${DXMATH_DEFS})

add_executable(xdsptest xdsp/Test.cpp)
target_compile_definitions(xdsptest PRIVATE ${DXMATH_DEFS})

source_group(cpuid REGULAR_EXPRESSION cpuid/*.*)
source_group(Ext REGULAR_EXPRESSION ext/*.*)
source_group(Math3 REGULAR_EXPRESSION math3/*.*)
source_group(shmathtest REGULAR_EXPRESSION shmath/*.*)
source_group(XDSPTest REGULAR_EXPRESSION xdsp/*.*)

target_include_directories( shmathtest PUBLIC ../SHMath )
target_include_directories( testavx PUBLIC ../Extensions )
target_include_directories( testavx2 PUBLIC ../Extensions )
target_include_directories( testbe PUBLIC ../Extensions )
target_include_directories( testf16c PUBLIC ../Extensions )
target_include_directories( testfma3 PUBLIC ../Extensions )
target_include_directories( testfma4 PUBLIC ../Extensions )
target_include_directories( testsse3 PUBLIC ../Extensions )
target_include_directories( testsse4 PUBLIC ../Extensions )
target_include_directories( xdsptest PUBLIC ../XDSP )

if (MSVC AND BUILD_FOR_ONECORE)
target_link_directories(cpuid PUBLIC ${VC_OneCore_LibPath})
target_link_directories(math3 PUBLIC ${VC_OneCore_LibPath})
Expand Down Expand Up @@ -240,4 +244,23 @@ if (MSVC AND BUILD_FOR_ONECORE)
target_link_libraries(xdsptest onecore.lib)
endif()

if (NOT WIN32)
include(ExternalProject)
ExternalProject_Add(
sal
PREFIX ${CMAKE_BINARY_DIR}/sal
URL http://raw.githubusercontent.com/dotnet/corert/master/src/Native/inc/unix/sal.h
URL_HASH SHA256=bb9ea7c1d05cdfc10a17fe80d87a7cd160c1063c7e5fa089cd6405c31c610a1b
DOWNLOAD_NO_EXTRACT ON
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(sal download_dir)
target_include_directories( math3 PUBLIC ${download_dir} )
target_include_directories( shmathtest PUBLIC ${download_dir} )
target_include_directories( xdsptest PUBLIC ${download_dir} )
endif()

set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT math3)
25 changes: 24 additions & 1 deletion math3/math3.cpp
Expand Up @@ -452,11 +452,34 @@ void ParseCommandLine(_In_z_ wchar_t* szCmdLine)
}
}

#ifdef __linux__
#include <linux/limits.h>
wchar_t* GetCommandLineW() {
char* cmdline = new char[ARG_MAX];
wchar_t* cmdline_w = new wchar_t[ARG_MAX];

FILE *fp = fopen("/proc/self/cmdline", "r");
fgets(cmdline, ARG_MAX, fp);
fclose(fp);

for(int i = 0 ; i < ARG_MAX; i++){
if(cmdline[i]=='\0'){
if(cmdline[i+1] == '\0'){break;}
cmdline[i]=' ';
}
}

mbstowcs(cmdline_w, cmdline, ARG_MAX);
delete[] cmdline;

return cmdline_w;
}
#endif // __linux__

int __cdecl main(void)
{
//Get the command line to check for global test settings
auto cmdLine = GetCommandLine();
auto cmdLine = GetCommandLineW();
ParseCommandLine(cmdLine);

int result = 0;
Expand Down
38 changes: 36 additions & 2 deletions math3/math3.h
Expand Up @@ -100,19 +100,51 @@
#define NOMCX
#pragma warning(pop)

#ifdef _WIN32
#include <Windows.h>
#else
#include <cstdint>
#include <functional>
#include <utility>

typedef long HRESULT;
typedef void* PVOID;
typedef void* LPVOID;
typedef int BOOL;
typedef float FLOAT;

#define S_OK ((HRESULT)0L)
#define E_FAIL ((HRESULT)0x80004005L)
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
#define FAILED(hr) (((HRESULT)(hr)) < 0)

#define __cdecl
#define __stdcall

#define TRUE 1u
#define FALSE 0u

#define _wcsnicmp wcsncasecmp
#endif

#define print printf
#define DATAPATH ""
static const int XB = 0;
static const int PC = 1;

#ifdef WIN32
#ifdef __GNUC__
#define BREAK { __asm__("int3"); }
#define DebugBreak() BREAK
#define __debugbreak() BREAK
#else
#define BREAK { _asm { int 3 }; }
#endif
#else
#define BREAK
#define DebugBreak()
#define __debugbreak()
#endif

using APITEST_FUNC = HRESULT(*)(const char* TestName);
#define LogProxy const char
Expand Down Expand Up @@ -268,9 +300,12 @@ struct APIFUNCT
const char* name;
};

#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cinttypes>
#include <cstring>
#include <iterator>

#include <DirectXMath.h>
#include <DirectXColors.h>
Expand All @@ -288,11 +323,10 @@ struct APIFUNCT

using XMVECTORI = DirectX::XMVECTORU32;

#ifndef __MINGW32__
#if !defined(__MINGW32__) && defined(WIN32)
#include <intrin.h>
#endif

#include <algorithm>
#include <cmath>

//extern "C" { extern HRESULT __stdcall MapDrive(char cDriveLetter, char* pszPartition); }
Expand Down
10 changes: 10 additions & 0 deletions math3/shared.cpp
Expand Up @@ -148,6 +148,16 @@ bool checksandbox(LogProxy* pLog, const uint8_t* sandbox1, const uint8_t* sandbo
**********************************/

#ifndef _WIN32
inline void * _aligned_malloc(size_t size, size_t alignment)
{
size = (size + alignment - 1) & ~(alignment - 1);
return std::aligned_alloc(alignment, size);
}

#define _aligned_free free
#endif

void AllocWithAlignment(
uint32_t dwSize, //Actual number of bytes to allocate.
uint32_t dwAlignment, //Actual number of bytes to return offset from a 32k page.
Expand Down
5 changes: 5 additions & 0 deletions shmath/test.cpp
Expand Up @@ -62,6 +62,11 @@ using Microsoft::WRL::ComPtr;
#pragma warning(disable:4189)
#endif

#ifndef _WIN32
#define sprintf_s(a,b,...) sprintf(a,b,__VA_ARGS__)
#define _vsnprintf_s(a,b,...) vsnprintf(a,b,__VA_ARGS__)
#endif

using namespace DirectX;

namespace
Expand Down
19 changes: 17 additions & 2 deletions xdsp/Test.cpp
Expand Up @@ -18,14 +18,19 @@
// C4820 padding added after data member
// C5045 Spectre mitigation warning

#include <memory>

#ifndef _WIN32
#define memcpy_s(d,ds,s,c) memcpy(d,s,c)
#endif

#include "XDSP.h"

#include <stdio.h>
#include <cstdio>
#include <float.h>
#include <malloc.h>

#include <cmath>
#include <memory>

//--------------------------------------------------------------------------------------
typedef DirectX::XMVECTOR XVECTOR;
Expand Down Expand Up @@ -78,6 +83,16 @@ void print( const XVEC* a, size_t count )
}
}

#ifndef _WIN32
inline void * _aligned_malloc(size_t size, size_t alignment)
{
size = (size + alignment - 1) & ~(alignment - 1);
return std::aligned_alloc(alignment, size);
}

#define _aligned_free free
#endif

struct aligned_deleter { void operator()(void* p) { _aligned_free(p); } };

typedef std::unique_ptr<XVEC, aligned_deleter> ScopedAlignedArrayXVEC;
Expand Down

0 comments on commit 79d393e

Please sign in to comment.