Browse Source

E2K: added initial support of MCST Elbrus 2000 CPU architecture

pull/305/head
r-a-sattarov 1 year ago
parent
commit
0d5f7a1916
  1. 2
      mathlib/mathlib_base.cpp
  2. 4
      mathlib/sse.cpp
  3. 4
      public/materialsystem/imesh.h
  4. 4
      public/mathlib/mathlib.h
  5. 8
      public/steam/steamtypes.h
  6. 13
      public/tier0/platform.h
  7. 8
      scripts/waifulib/compiler_optimizations.py
  8. 4
      tier0/cpu.cpp
  9. 5
      tier0/cpu_posix.cpp
  10. 2
      tier1/processor_detect_linux.cpp
  11. 2
      tier1/reliabletimer.cpp
  12. 4
      vtf/vtf.cpp
  13. 3
      wscript

2
mathlib/mathlib_base.cpp

@ -3281,7 +3281,7 @@ void MathLib_Init( float gamma, float texGamma, float brightness, int overbright
{ {
s_bSSEEnabled = true; s_bSSEEnabled = true;
#ifndef PLATFORM_WINDOWS_PC64 #if !defined(PLATFORM_WINDOWS_PC64) && (defined(__i386__) || defined(__amd64__))
// These are not yet available. // These are not yet available.
// Select the SSE specific routines if available // Select the SSE specific routines if available
pfVectorNormalize = _VectorNormalize; pfVectorNormalize = _VectorNormalize;

4
mathlib/sse.cpp

@ -15,6 +15,8 @@
#include "sse2neon.h" #include "sse2neon.h"
#endif #endif
#if !defined(__e2k__)
#include "sse.h" #include "sse.h"
// memdbgon must be the last include file in a .cpp file!!! // memdbgon must be the last include file in a .cpp file!!!
@ -1127,3 +1129,5 @@ vec_t DotProduct (const vec_t *a, const vec_t *c)
*/ */
#endif // COMPILER_MSVC64 #endif // COMPILER_MSVC64
#endif // !defined(__e2k__)

4
public/materialsystem/imesh.h

@ -1152,7 +1152,7 @@ inline void CVertexBuilder::FastAdvanceNVertices( int n )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
inline void CVertexBuilder::FastVertex( const ModelVertexDX7_t &vertex ) 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 ); FastVertexSSE( vertex );
#else #else
Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed
@ -1354,7 +1354,7 @@ inline void CVertexBuilder::Fast4VerticesSSE(
inline void CVertexBuilder::FastVertex( const ModelVertexDX8_t &vertex ) 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 ); FastVertexSSE( vertex );
#else #else
Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed Assert( m_CompressionType == VERTEX_COMPRESSION_NONE ); // FIXME: support compressed verts if needed

4
public/mathlib/mathlib.h

@ -1201,7 +1201,7 @@ FORCEINLINE int RoundFloatToInt(float f)
}; };
flResult = __fctiw( f ); flResult = __fctiw( f );
return pResult[1]; return pResult[1];
#elif defined (__arm__) || defined (__aarch64__) #elif defined (__arm__) || defined (__aarch64__) || defined(__e2k__)
return (int)(f + 0.5f); return (int)(f + 0.5f);
#else #else
#error Unknown architecture #error Unknown architecture
@ -1233,7 +1233,7 @@ FORCEINLINE unsigned long RoundFloatToUnsignedLong(float f)
Assert( pIntResult[1] >= 0 ); Assert( pIntResult[1] >= 0 );
return pResult[1]; return pResult[1];
#else // !X360 #else // !X360
#if defined(__arm__) || defined(__aarch64__) #if defined(__arm__) || defined(__aarch64__) || defined(__e2k__)
return (unsigned long)(f + 0.5f); return (unsigned long)(f + 0.5f);
#elif defined( PLATFORM_WINDOWS_PC64 ) #elif defined( PLATFORM_WINDOWS_PC64 )
uint nRet = ( uint ) f; uint nRet = ( uint ) f;

8
public/steam/steamtypes.h

@ -24,10 +24,6 @@ typedef unsigned char uint8;
#define POSIX 1 #define POSIX 1
#endif #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. // 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) #if !defined(VALVE_BIG_ENDIAN) && defined(_PS3)
#define VALVE_BIG_ENDIAN #define VALVE_BIG_ENDIAN
@ -48,7 +44,7 @@ typedef unsigned __int64 uint64;
typedef int64 lint64; typedef int64 lint64;
typedef uint64 ulint64; typedef uint64 ulint64;
#ifdef X64BITS #ifdef PLATFORM_64BITS
typedef __int64 intp; // intp is an integer that can accomodate a pointer 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 *) typedef unsigned __int64 uintp; // (ie, sizeof(intp) >= sizeof(int) && sizeof(intp) >= sizeof(void *)
#else #else
@ -74,7 +70,7 @@ typedef unsigned long long uint64;
typedef long int lint64; typedef long int lint64;
typedef unsigned long int ulint64; typedef unsigned long int ulint64;
#ifdef X64BITS #ifdef PLATFORM_64BITS
typedef long long intp; typedef long long intp;
typedef unsigned long long uintp; typedef unsigned long long uintp;
#else #else

13
public/tier0/platform.h

@ -9,7 +9,7 @@
#ifndef PLATFORM_H #ifndef PLATFORM_H
#define 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 #define PLATFORM_64BITS 1
#endif #endif
@ -17,6 +17,11 @@
#define COMPILER_GCC 1 #define COMPILER_GCC 1
#endif #endif
#if defined(__LCC__) && defined(__MCST__)
// MCST LCC (eLbrus Compiler Collection)
#define COMPILER_MCST_LCC 1
#endif
#ifdef __GLIBC__ #ifdef __GLIBC__
#define PLATFORM_GLIBC 1 #define PLATFORM_GLIBC 1
#endif #endif
@ -898,7 +903,7 @@ static FORCEINLINE double fsel(double fComparand, double fValGE, double fLT)
#endif #endif
#endif #endif
#elif defined (__arm__) || defined (__aarch64__) #elif defined (__arm__) || defined (__aarch64__) || defined(__e2k__)
inline void SetupFPUControlWord() {} inline void SetupFPUControlWord() {}
#else #else
inline void SetupFPUControlWord() inline void SetupFPUControlWord()
@ -1069,7 +1074,7 @@ inline T QWordSwapC( T dw )
// The typically used methods. // 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 #define VALVE_LITTLE_ENDIAN 1
#endif #endif
@ -1235,7 +1240,7 @@ PLATFORM_INTERFACE struct tm * Plat_localtime( const time_t *timep, struct tm *
inline uint64 Plat_Rdtsc() inline uint64 Plat_Rdtsc()
{ {
#if (defined( __arm__ ) || defined( __aarch64__ )) && defined (POSIX) #if (defined( __arm__ ) || defined( __aarch64__ ) || defined(__e2k__)) && defined (POSIX)
struct timespec t; struct timespec t;
clock_gettime( CLOCK_REALTIME, &t); clock_gettime( CLOCK_REALTIME, &t);
return t.tv_sec * 1000000000ULL + t.tv_nsec; return t.tv_sec * 1000000000ULL + t.tv_nsec;

8
scripts/waifulib/compiler_optimizations.py

@ -30,7 +30,7 @@ compiler_optimizations.CFLAGS['gottagofast'] = {
} }
''' '''
VALID_BUILD_TYPES = ['fastnative', 'fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none'] VALID_BUILD_TYPES = ['native','fastnative', 'fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none']
LINKFLAGS = { LINKFLAGS = {
'common': { 'common': {
@ -65,6 +65,12 @@ CFLAGS = {
'clang': ['-O2', '-march=native'], 'clang': ['-O2', '-march=native'],
'default': ['-O3'] 'default': ['-O3']
}, },
'native': {
'msvc': ['/O2', '/Oy', '/MT'],
'gcc': ['-O2', '-march=native'],
'clang': ['-O2', '-march=native'],
'default': ['-O3']
},
'release': { 'release': {
'msvc': ['/O2', '/MT'], 'msvc': ['/O2', '/MT'],
'owcc': ['-O3', '-fomit-leaf-frame-pointer', '-fomit-frame-pointer', '-finline-functions', '-finline-limit=512'], 'owcc': ['-O3', '-fomit-leaf-frame-pointer', '-fomit-frame-pointer', '-finline-functions', '-finline-limit=512'],

4
tier0/cpu.cpp

@ -22,7 +22,7 @@ const tchar* GetProcessorVendorId();
static bool cpuid(uint32 function, uint32& out_eax, uint32& out_ebx, uint32& out_ecx, uint32& out_edx) 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; return false;
#elif defined(GNUC) #elif defined(GNUC)
@ -376,6 +376,8 @@ const tchar* GetProcessorArchName()
return "aarch64"; return "aarch64";
#elif defined __arm__ || defined _M_ARM #elif defined __arm__ || defined _M_ARM
return "arm"; return "arm";
#elif defined(__e2k__)
return "e2k";
#else #else
#error "Unknown architecture" #error "Unknown architecture"
#endif #endif

5
tier0/cpu_posix.cpp

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

2
tier1/processor_detect_linux.cpp

@ -13,7 +13,7 @@ bool CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; } bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; } bool CheckSSE2Technology(void) { return false; }
bool Check3DNowTechnology(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 CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; } bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; } bool CheckSSE2Technology(void) { return false; }

2
tier1/reliabletimer.cpp

@ -91,6 +91,8 @@ int64 CReliableTimer::GetPerformanceCountNow()
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts); clock_gettime(CLOCK_REALTIME, &ts);
return ts.tv_sec * 1000000000ULL + ts.tv_nsec; return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
#elif defined(__e2k__)
return (int64)Plat_Rdtsc();
#else #else
uint64 un64; uint64 un64;
__asm__ __volatile__ ( __asm__ __volatile__ (

4
vtf/vtf.cpp

@ -951,7 +951,8 @@ static bool ReadHeaderFromBufferPastBaseHeader( CUtlBuffer &buf, VTFFileHeader_t
bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header ) bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header )
{ {
if ( IsX360() && SetupByteSwap( buf ) ) #ifdef _X360
if ( SetupByteSwap( buf ) )
{ {
VTFFileBaseHeader_t baseHeader; VTFFileBaseHeader_t baseHeader;
m_Swap.SwapFieldsToTargetEndian( &baseHeader, (VTFFileBaseHeader_t*)buf.PeekGet() ); m_Swap.SwapFieldsToTargetEndian( &baseHeader, (VTFFileBaseHeader_t*)buf.PeekGet() );
@ -979,6 +980,7 @@ bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header )
} }
} }
} }
#endif
memset( &header, 0, sizeof(VTFFileHeader_t) ); memset( &header, 0, sizeof(VTFFileHeader_t) );
buf.Get( &header, sizeof(VTFFileBaseHeader_t) ); buf.Get( &header, sizeof(VTFFileBaseHeader_t) );

3
wscript

@ -502,6 +502,9 @@ def configure(conf):
if conf.env.DEST_OS == 'freebsd': if conf.env.DEST_OS == 'freebsd':
linkflags += ['-lexecinfo'] linkflags += ['-lexecinfo']
if conf.env.DEST_OS != 'darwin':
linkflags += ['-latomic']
if conf.env.DEST_OS != 'win32': if conf.env.DEST_OS != 'win32':
cflags += flags cflags += flags
linkflags += flags linkflags += flags

Loading…
Cancel
Save