2
0
mirror of https://github.com/rehlds/rehlds.git synced 2025-01-16 00:28:20 +03:00

Added GAS syntax support

This commit is contained in:
asmodai 2016-04-30 18:51:54 +03:00
parent 312a03f9aa
commit a1b80ad704
5 changed files with 122 additions and 11 deletions

View File

@ -470,11 +470,15 @@ qboolean SV_IsPlayerIndex(int index)
return (index >= 1 && index <= g_psvs.maxclients); return (index >= 1 && index <= g_psvs.maxclients);
} }
qboolean __declspec(naked) SV_IsPlayerIndex_wrapped(int index) #if defined _MSC_VER || defined __INTEL_COMPILER
__declspec(naked)
#endif
qboolean SV_IsPlayerIndex_wrapped(int index)
{ {
// Original SV_IsPlayerIndex in swds.dll doesn't modify ecx nor edx. // Original SV_IsPlayerIndex in swds.dll doesn't modify ecx nor edx.
// During the compilation of original swds.dll compiler was assuming that these registers wouldn't be modified during call to SV_IsPlayerIndex(). // During the compilation of original swds.dll compiler was assuming that these registers wouldn't be modified during call to SV_IsPlayerIndex().
// This is not true for code produced by msvc2013 (which uses ecx even in Release config). That's why we need a wrapper here that preserves ecx and edx before call to reversed SV_IsPlayerIndex(). // This is not true for code produced by msvc2013 (which uses ecx even in Release config). That's why we need a wrapper here that preserves ecx and edx before call to reversed SV_IsPlayerIndex().
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm __asm
{ {
mov eax, dword ptr[esp + 4]; mov eax, dword ptr[esp + 4];
@ -487,6 +491,20 @@ qboolean __declspec(naked) SV_IsPlayerIndex_wrapped(int index)
pop ecx; pop ecx;
retn; retn;
} }
#else
asm volatile (
"pushl %%ecx\n\t"
"pushl %%edx\n\t"
"pushl %0\n\t"
"call $SV_IsPlayerIndex\n\t"
"addl %%esp, $4\n\t"
"popl %%edx\n\t"
"popl %%ecx\n\t"
"retn"
::
"g" (index)
);
#endif
} }
/* <a6717> ../engine/sv_main.c:514 */ /* <a6717> ../engine/sv_main.c:514 */
@ -5371,6 +5389,7 @@ void EXT_FUNC SV_WriteVoiceCodec_internal(sizebuf_t *pBuf)
*/ */
void __invokeValvesBuggedCreateBaseline(void* func, int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec_t* pmins, vec_t* pmaxs) void __invokeValvesBuggedCreateBaseline(void* func, int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec_t* pmins, vec_t* pmaxs)
{ {
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm { __asm {
mov ecx, func mov ecx, func
push 0 push 0
@ -5387,6 +5406,35 @@ void __invokeValvesBuggedCreateBaseline(void* func, int player, int eindex, stru
call ecx call ecx
add esp, 0x2C add esp, 0x2C
} }
#else
asm volatile (
"movl %%ecx, %0\n\t"
"pushl $0\n\t"
"pushl $1\n\t"
"pushl $0\n\t"
"pushl $0\n\t"
"pushl %1\n\t"
"pushl %2\n\t"
"pushl %3\n\t"
"pushl %4\n\t"
"pushl %5\n\t"
"pushl %6\n\t"
"pushl %7\n\t"
"call *%%ecx\n\t"
"addl %%esp, $0x2C"
::
"g" (func),
"g" (pmaxs),
"g" (pmins),
"g" (playermodelindex),
"g" (entity),
"g" (baseline),
"g" (eindex),
"g" (player)
:
"ecx"
);
#endif
} }
/* <a9cf9> ../engine/sv_main.c:6866 */ /* <a9cf9> ../engine/sv_main.c:6866 */

View File

@ -218,15 +218,25 @@ void Sys_SetupFPUOptions()
{ {
static uint8 fpuOpts[32]; static uint8 fpuOpts[32];
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm { fnstenv byte ptr fpuOpts } __asm { fnstenv byte ptr fpuOpts }
fpuOpts[0] |= 0x3Fu; fpuOpts[0] |= 0x3Fu;
__asm { fldenv byte ptr fpuOpts } __asm { fldenv byte ptr fpuOpts }
#else
asm volatile ("fnstenv %0" : "=m" (fpuOpts));
fpuOpts[0] |= 0x3Fu;
asm volatile ("fldenv %0" : "=m" (fpuOpts));
#endif
} }
NOINLINE void Sys_InitFPUControlWords() NOINLINE void Sys_InitFPUControlWords()
{ {
int fpucw = 0; int fpucw = 0;
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm { fnstcw fpucw } __asm { fnstcw fpucw }
#else
asm volatile ("fnstcw %0" : "=m" (fpucw));
#endif
g_FPUCW_Mask_Prec_64Bit = (fpucw & 0xF0FF) | 0x300; g_FPUCW_Mask_Prec_64Bit = (fpucw & 0xF0FF) | 0x300;
g_FPUCW_Mask_Prec_64Bit_2 = (fpucw & 0xF0FF) | 0x300; g_FPUCW_Mask_Prec_64Bit_2 = (fpucw & 0xF0FF) | 0x300;
@ -283,13 +293,27 @@ void __cdecl Sys_InitHardwareTimer()
int g_SavedFPUCW1 = 0; int g_SavedFPUCW1 = 0;
NOINLINE void Sys_FPUCW_Push_Prec64() { NOINLINE void Sys_FPUCW_Push_Prec64() {
uint16 tmp = g_FPUCW_Mask_Prec_64Bit; uint16 tmp = g_FPUCW_Mask_Prec_64Bit;
__asm { fnstcw g_SavedFPUCW1 } #if defined _MSC_VER || defined __INTEL_COMPILER
__asm { fldcw tmp } __asm {
fnstcw g_SavedFPUCW1;
fldcw tmp;
}
#else
asm volatile ("fnstcw %0\n\t"
"fldcw %1" :
"=m" (g_SavedFPUCW1),
"=m" (tmp));
#endif
} }
NOINLINE void Sys_FPUCW_Pop_Prec64() { NOINLINE void Sys_FPUCW_Pop_Prec64() {
uint16 tmp = g_SavedFPUCW1; uint16 tmp = g_SavedFPUCW1;
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm { fldcw tmp } __asm { fldcw tmp }
#else
asm volatile ("fldcw %0" : "=m" (tmp));
#endif
} }
#endif // _WIN32 #endif // _WIN32

View File

@ -246,6 +246,7 @@ inline void CCycleCount::Init(float initTimeMsec)
inline void CCycleCount::Sample() inline void CCycleCount::Sample()
{ {
unsigned long* pSample = (unsigned long *)&m_Int64; unsigned long* pSample = (unsigned long *)&m_Int64;
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm __asm
{ {
// force the cpu to synchronize the instruction queue // force the cpu to synchronize the instruction queue
@ -253,11 +254,23 @@ inline void CCycleCount::Sample()
//cpuid //cpuid
//cpuid //cpuid
//cpuid //cpuid
mov ecx, pSample mov ecx, pSample;
rdtsc rdtsc;
mov[ecx], eax mov [ecx], eax;
mov[ecx + 4], edx mov [ecx + 4], edx;
} }
#else
asm volatile (
"movl %%ecx, %0\n\t"
"rdtsc\n\t"
"mov (%%ecx), %%eax\n\t"
"mov $4(%%ecx), %%edx"
::
"r" (pSample)
:
"eax", "ecx", "edx"
);
#endif
} }

View File

@ -103,7 +103,11 @@ typedef void * HINSTANCE;
#endif #endif
// Used to step into the debugger // Used to step into the debugger
#if defined _MSC_VER || defined __INTEL_COMPILER
#define DebuggerBreak() __asm { int 3 } #define DebuggerBreak() __asm { int 3 }
#else
#define DebuggerBreak() asm volatile ("int 3")
#endif
// C functions for external declarations that call the appropriate C++ methods // C functions for external declarations that call the appropriate C++ methods
#ifndef EXPORT #ifndef EXPORT
@ -263,21 +267,39 @@ inline T DWordSwapC(T dw)
template <typename T> template <typename T>
inline T WordSwapAsm(T w) inline T WordSwapAsm(T w)
{ {
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm __asm
{ {
mov ax, w mov ax, w;
xchg al, ah xchg al, ah;
} }
#else
asm volatile (
"movw %%ax, %0\n\t"
"xchgb %%al, %%ah\n\t"
::
"m" (w)
);
#endif
} }
template <typename T> template <typename T>
inline T DWordSwapAsm(T dw) inline T DWordSwapAsm(T dw)
{ {
#if defined _MSC_VER || defined __INTEL_COMPILER
__asm __asm
{ {
mov eax, dw mov eax, dw;
bswap eax bswap eax;
} }
#else
asm volatile (
"movl %%eax, %0\n\t"
"bswapl %%eax\n\t"
::
"m" (dw)
);
#endif
} }
#pragma warning(pop) #pragma warning(pop)

View File

@ -5,9 +5,11 @@ import org.gradle.nativeplatform.NativeExecutableBinarySpec
import org.gradle.nativeplatform.SharedLibraryBinarySpec import org.gradle.nativeplatform.SharedLibraryBinarySpec
import org.gradle.nativeplatform.StaticLibraryBinarySpec import org.gradle.nativeplatform.StaticLibraryBinarySpec
import org.gradle.nativeplatform.toolchain.VisualCpp import org.gradle.nativeplatform.toolchain.VisualCpp
import org.gradle.nativeplatform.toolchain.Clang
apply from: 'shared_msvc.gradle' apply from: 'shared_msvc.gradle'
apply from: 'shared_icc.gradle' apply from: 'shared_icc.gradle'
apply from: 'shared_llvm.gradle'
rootProject.ext.createToolchainConfig = { NativeBinarySpec bin -> rootProject.ext.createToolchainConfig = { NativeBinarySpec bin ->
BinaryKind binaryKind BinaryKind binaryKind
@ -27,6 +29,8 @@ rootProject.ext.createToolchainConfig = { NativeBinarySpec bin ->
return rootProject.createMsvcConfig(releaseBuild, binaryKind) return rootProject.createMsvcConfig(releaseBuild, binaryKind)
} else if (bin.toolChain instanceof Icc) { } else if (bin.toolChain instanceof Icc) {
return rootProject.createIccConfig(releaseBuild, binaryKind) return rootProject.createIccConfig(releaseBuild, binaryKind)
} else if (bin.toolChain instanceof Clang) {
return rootProject.createClangConfig(releaseBuild, binaryKind)
} else { } else {
throw new RuntimeException("Unknown native toolchain: ${bin.toolChain.class.name}") throw new RuntimeException("Unknown native toolchain: ${bin.toolChain.class.name}")
} }