Browse Source

E2K: added initial support of MCST Elbrus 2000 CPU architecture

pull/305/head
r-a-sattarov 9 months 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 @@ -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;

4
mathlib/sse.cpp

@ -15,6 +15,8 @@ @@ -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!!!
@ -1127,3 +1129,5 @@ vec_t DotProduct (const vec_t *a, const vec_t *c) @@ -1127,3 +1129,5 @@ vec_t DotProduct (const vec_t *a, const vec_t *c)
*/
#endif // COMPILER_MSVC64
#endif // !defined(__e2k__)

4
public/materialsystem/imesh.h

@ -1152,7 +1152,7 @@ inline void CVertexBuilder::FastAdvanceNVertices( int n ) @@ -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
@ -1354,7 +1354,7 @@ inline void CVertexBuilder::Fast4VerticesSSE( @@ -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

4
public/mathlib/mathlib.h

@ -1201,7 +1201,7 @@ FORCEINLINE int RoundFloatToInt(float f) @@ -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
@ -1233,7 +1233,7 @@ FORCEINLINE unsigned long RoundFloatToUnsignedLong(float f) @@ -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;

8
public/steam/steamtypes.h

@ -24,10 +24,6 @@ typedef unsigned char uint8; @@ -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
@ -48,7 +44,7 @@ typedef unsigned __int64 uint64; @@ -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
@ -74,7 +70,7 @@ typedef unsigned long long uint64; @@ -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

13
public/tier0/platform.h

@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
#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
@ -17,6 +17,11 @@ @@ -17,6 +17,11 @@
#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
@ -898,7 +903,7 @@ static FORCEINLINE double fsel(double fComparand, double fValGE, double fLT) @@ -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()
@ -1069,7 +1074,7 @@ inline T QWordSwapC( T dw ) @@ -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
@ -1235,7 +1240,7 @@ PLATFORM_INTERFACE struct tm * Plat_localtime( const time_t *timep, struct tm * @@ -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;

8
scripts/waifulib/compiler_optimizations.py

@ -30,7 +30,7 @@ compiler_optimizations.CFLAGS['gottagofast'] = { @@ -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 = {
'common': {
@ -65,6 +65,12 @@ CFLAGS = { @@ -65,6 +65,12 @@ CFLAGS = {
'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'],

4
tier0/cpu.cpp

@ -22,7 +22,7 @@ const tchar* GetProcessorVendorId(); @@ -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)
@ -376,6 +376,8 @@ const tchar* GetProcessorArchName() @@ -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

5
tier0/cpu_posix.cpp

@ -124,7 +124,7 @@ uint64 CalculateCPUFreq() @@ -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
@ -178,7 +178,6 @@ uint64 CalculateCPUFreq() @@ -178,7 +178,6 @@ uint64 CalculateCPUFreq()
#else
// ARM hard-coded frequency
return (uint64)2000000000;
#endif // if !ARM
#endif // if i386
#endif // if APPLE
}

2
tier1/processor_detect_linux.cpp

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

2
tier1/reliabletimer.cpp

@ -91,6 +91,8 @@ int64 CReliableTimer::GetPerformanceCountNow() @@ -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__ (

4
vtf/vtf.cpp

@ -951,7 +951,8 @@ static bool ReadHeaderFromBufferPastBaseHeader( CUtlBuffer &buf, VTFFileHeader_t @@ -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() );
@ -979,6 +980,7 @@ bool CVTFTexture::ReadHeader( CUtlBuffer &buf, VTFFileHeader_t &header ) @@ -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) );

3
wscript

@ -502,6 +502,9 @@ def configure(conf): @@ -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

Loading…
Cancel
Save