Skip to content

Commit

Permalink
E2K: added initial support of MCST Elbrus 2000 CPU architecture
Browse files Browse the repository at this point in the history
  • Loading branch information
r-a-sattarov committed Mar 7, 2024
1 parent 5a4d0b7 commit 0d5f7a1
Show file tree
Hide file tree
Showing 13 changed files with 41 additions and 22 deletions.
2 changes: 1 addition & 1 deletion mathlib/mathlib_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3281,7 +3281,7 @@ void MathLib_Init( float gamma, float texGamma, float brightness, int overbright
{
s_bSSEEnabled = true;

#ifndef PLATFORM_WINDOWS_PC64
#if !defined(PLATFORM_WINDOWS_PC64) && (defined(__i386__) || defined(__amd64__))
// These are not yet available.
// Select the SSE specific routines if available
pfVectorNormalize = _VectorNormalize;
Expand Down
4 changes: 4 additions & 0 deletions mathlib/sse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include "sse2neon.h"
#endif

#if !defined(__e2k__)

#include "sse.h"

// memdbgon must be the last include file in a .cpp file!!!
Expand Down Expand Up @@ -1127,3 +1129,5 @@ vec_t DotProduct (const vec_t *a, const vec_t *c)
*/

#endif // COMPILER_MSVC64

#endif // !defined(__e2k__)
4 changes: 2 additions & 2 deletions public/materialsystem/imesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -1152,7 +1152,7 @@ inline void CVertexBuilder::FastAdvanceNVertices( int n )
//-----------------------------------------------------------------------------
inline void CVertexBuilder::FastVertex( const ModelVertexDX7_t &vertex )
{
#if defined(__arm__) || defined(__aarch64__) || defined(PLATFORM_WINDOWS_PC64)
#if defined(__arm__) || defined(__aarch64__) || defined(__e2k__) || defined(PLATFORM_WINDOWS_PC64)
FastVertexSSE( vertex );
#else
Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed
Expand Down Expand Up @@ -1354,7 +1354,7 @@ inline void CVertexBuilder::Fast4VerticesSSE(

inline void CVertexBuilder::FastVertex( const ModelVertexDX8_t &vertex )
{
#if defined(__arm__) || defined(__aarch64__) || defined(PLATFORM_WINDOWS_PC64)
#if defined(__arm__) || defined(__aarch64__) || defined(__e2k__) || defined(PLATFORM_WINDOWS_PC64)
FastVertexSSE( vertex );
#else
Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed
Expand Down
4 changes: 2 additions & 2 deletions public/mathlib/mathlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -1201,7 +1201,7 @@ FORCEINLINE int RoundFloatToInt(float f)
};
flResult = __fctiw( f );
return pResult[1];
#elif defined (__arm__) || defined (__aarch64__)
#elif defined (__arm__) || defined (__aarch64__) || defined(__e2k__)
return (int)(f + 0.5f);
#else
#error Unknown architecture
Expand Down Expand Up @@ -1233,7 +1233,7 @@ FORCEINLINE unsigned long RoundFloatToUnsignedLong(float f)
Assert( pIntResult[1] >= 0 );
return pResult[1];
#else // !X360
#if defined(__arm__) || defined(__aarch64__)
#if defined(__arm__) || defined(__aarch64__) || defined(__e2k__)
return (unsigned long)(f + 0.5f);
#elif defined( PLATFORM_WINDOWS_PC64 )
uint nRet = ( uint ) f;
Expand Down
8 changes: 2 additions & 6 deletions public/steam/steamtypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ typedef unsigned char uint8;
#define POSIX 1
#endif

#if defined(__x86_64__) || defined(_WIN64) || defined(__aarch64__)
#define X64BITS
#endif

// Make sure VALVE_BIG_ENDIAN gets set on PS3, may already be set previously in Valve internal code.
#if !defined(VALVE_BIG_ENDIAN) && defined(_PS3)
#define VALVE_BIG_ENDIAN
Expand All @@ -48,7 +44,7 @@ typedef unsigned __int64 uint64;
typedef int64 lint64;
typedef uint64 ulint64;

#ifdef X64BITS
#ifdef PLATFORM_64BITS
typedef __int64 intp; // intp is an integer that can accomodate a pointer
typedef unsigned __int64 uintp; // (ie, sizeof(intp) >= sizeof(int) && sizeof(intp) >= sizeof(void *)
#else
Expand All @@ -74,7 +70,7 @@ typedef unsigned long long uint64;
typedef long int lint64;
typedef unsigned long int ulint64;

#ifdef X64BITS
#ifdef PLATFORM_64BITS
typedef long long intp;
typedef unsigned long long uintp;
#else
Expand Down
13 changes: 9 additions & 4 deletions public/tier0/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@
#ifndef PLATFORM_H
#define PLATFORM_H

#if defined(__x86_64__) || defined(_WIN64) || defined(__aarch64__)
#if defined(__x86_64__) || defined(_WIN64) || defined(__aarch64__) || defined(__e2k__)
#define PLATFORM_64BITS 1
#endif

#if defined(__GCC__) || defined(__GNUC__)
#define COMPILER_GCC 1
#endif

#if defined(__LCC__) && defined(__MCST__)
// MCST LCC (eLbrus Compiler Collection)
#define COMPILER_MCST_LCC 1
#endif

#ifdef __GLIBC__
#define PLATFORM_GLIBC 1
#endif
Expand Down Expand Up @@ -898,7 +903,7 @@ static FORCEINLINE double fsel(double fComparand, double fValGE, double fLT)

#endif
#endif
#elif defined (__arm__) || defined (__aarch64__)
#elif defined (__arm__) || defined (__aarch64__) || defined(__e2k__)
inline void SetupFPUControlWord() {}
#else
inline void SetupFPUControlWord()
Expand Down Expand Up @@ -1069,7 +1074,7 @@ inline T QWordSwapC( T dw )
// The typically used methods.
//-------------------------------------

#if (defined(__i386__) || defined(__amd64__) || defined(__arm__) || defined(__aarch64__)) && !defined(VALVE_LITTLE_ENDIAN)
#if (defined(__i386__) || defined(__amd64__) || defined(__arm__) || defined(__aarch64__) || defined(__e2k__)) && !defined(VALVE_LITTLE_ENDIAN)
#define VALVE_LITTLE_ENDIAN 1
#endif

Expand Down Expand Up @@ -1235,7 +1240,7 @@ PLATFORM_INTERFACE struct tm * Plat_localtime( const time_t *timep, struct tm *

inline uint64 Plat_Rdtsc()
{
#if (defined( __arm__ ) || defined( __aarch64__ )) && defined (POSIX)
#if (defined( __arm__ ) || defined( __aarch64__ ) || defined(__e2k__)) && defined (POSIX)
struct timespec t;
clock_gettime( CLOCK_REALTIME, &t);
return t.tv_sec * 1000000000ULL + t.tv_nsec;
Expand Down
8 changes: 7 additions & 1 deletion scripts/waifulib/compiler_optimizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
}
'''

VALID_BUILD_TYPES = ['fastnative', 'fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none']
VALID_BUILD_TYPES = ['native','fastnative', 'fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none']

LINKFLAGS = {
'common': {
Expand Down Expand Up @@ -65,6 +65,12 @@
'clang': ['-O2', '-march=native'],
'default': ['-O3']
},
'native': {
'msvc': ['/O2', '/Oy', '/MT'],
'gcc': ['-O2', '-march=native'],
'clang': ['-O2', '-march=native'],
'default': ['-O3']
},
'release': {
'msvc': ['/O2', '/MT'],
'owcc': ['-O3', '-fomit-leaf-frame-pointer', '-fomit-frame-pointer', '-finline-functions', '-finline-limit=512'],
Expand Down
4 changes: 3 additions & 1 deletion tier0/cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const tchar* GetProcessorVendorId();

static bool cpuid(uint32 function, uint32& out_eax, uint32& out_ebx, uint32& out_ecx, uint32& out_edx)
{
#if defined (__arm__) || defined (__aarch64__) || defined( _X360 )
#if defined (__arm__) || defined (__aarch64__) || defined(__e2k__) || defined( _X360 )
return false;
#elif defined(GNUC)

Expand Down Expand Up @@ -376,6 +376,8 @@ const tchar* GetProcessorArchName()
return "aarch64";
#elif defined __arm__ || defined _M_ARM
return "arm";
#elif defined(__e2k__)
return "e2k";
#else
#error "Unknown architecture"
#endif
Expand Down
5 changes: 2 additions & 3 deletions tier0/cpu_posix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ uint64 CalculateCPUFreq()
}
}

#if !defined(__arm__) && !defined(__aarch64__)
#if defined(__i386__) || defined(_M_IX86)
// fallback mechanism to calculate when failed
// Compute the period. Loop until we get 3 consecutive periods that
// are the same to within a small error. The error is chosen
Expand Down Expand Up @@ -178,7 +178,6 @@ uint64 CalculateCPUFreq()
#else
// ARM hard-coded frequency
return (uint64)2000000000;
#endif // if !ARM
#endif // if i386
#endif // if APPLE
}

2 changes: 1 addition & 1 deletion tier1/processor_detect_linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ bool CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; }
bool Check3DNowTechnology(void) { return false; }
#elif defined (__arm__) || defined (__aarch64__)
#elif defined (__arm__) || defined (__aarch64__) || defined(__e2k__)
bool CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; }
Expand Down
2 changes: 2 additions & 0 deletions tier1/reliabletimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ int64 CReliableTimer::GetPerformanceCountNow()
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
#elif defined(__e2k__)
return (int64)Plat_Rdtsc();
#else
uint64 un64;
__asm__ __volatile__ (
Expand Down
4 changes: 3 additions & 1 deletion vtf/vtf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,8 @@ static bool ReadHeaderFromBufferPastBaseHeader( CUtlBuffer &buf, VTFFileHeader_t

bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header )
{
if ( IsX360() && SetupByteSwap( buf ) )
#ifdef _X360
if ( SetupByteSwap( buf ) )
{
VTFFileBaseHeader_t baseHeader;
m_Swap.SwapFieldsToTargetEndian( &baseHeader, (VTFFileBaseHeader_t*)buf.PeekGet() );
Expand Down Expand Up @@ -979,6 +980,7 @@ bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header )
}
}
}
#endif

memset( &header, 0, sizeof(VTFFileHeader_t) );
buf.Get( &header, sizeof(VTFFileBaseHeader_t) );
Expand Down
3 changes: 3 additions & 0 deletions wscript
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,9 @@ def configure(conf):
if conf.env.DEST_OS == 'freebsd':
linkflags += ['-lexecinfo']

if conf.env.DEST_OS != 'darwin':
linkflags += ['-latomic']

if conf.env.DEST_OS != 'win32':
cflags += flags
linkflags += flags
Expand Down

0 comments on commit 0d5f7a1

Please sign in to comment.