port from perforce
This commit is contained in:
219
evoke-64k/trunk/ev10/intrin.cpp
Normal file
219
evoke-64k/trunk/ev10/intrin.cpp
Normal file
@@ -0,0 +1,219 @@
|
||||
unsigned int myrand()
|
||||
{
|
||||
static int i= 0;
|
||||
i*= 78547803;
|
||||
i+= 1747627;
|
||||
return i;
|
||||
}
|
||||
|
||||
#ifdef SUPERSMALL
|
||||
extern "C" int _fltused;
|
||||
int _fltused;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
__declspec(naked) void _ftol2()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
fistp DWORD PTR [esp-12]
|
||||
mov eax, DWORD PTR [esp-12]
|
||||
mov ecx, DWORD PTR [esp-8]
|
||||
|
||||
ret
|
||||
}
|
||||
}
|
||||
__declspec(naked) void _ftol2_sse()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
fistp DWORD PTR [esp-12]
|
||||
mov eax, DWORD PTR [esp-12]
|
||||
mov ecx, DWORD PTR [esp-8]
|
||||
|
||||
ret
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern "C" int ____security_cookie;
|
||||
int ____security_cookie;
|
||||
|
||||
#ifdef SUPERSMALL
|
||||
/*extern "C"
|
||||
{
|
||||
__declspec(naked) void _ftol2()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
fistp DWORD PTR [esp-12]
|
||||
mov eax, DWORD PTR [esp-12]
|
||||
mov ecx, DWORD PTR [esp-8]
|
||||
|
||||
ret
|
||||
}
|
||||
}
|
||||
__declspec(naked) void _ftol2_sse()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
fistp DWORD PTR [esp-12]
|
||||
mov eax, DWORD PTR [esp-12]
|
||||
mov ecx, DWORD PTR [esp-8]
|
||||
|
||||
ret
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
float mypow( float a, float b)
|
||||
{
|
||||
// faster pow based on code by agner fog
|
||||
__asm
|
||||
{
|
||||
fld b;
|
||||
fld a;
|
||||
|
||||
// ftst;
|
||||
// fstsw ax;
|
||||
// sahf;
|
||||
// jz zero;
|
||||
|
||||
fyl2x;
|
||||
fist dword ptr [a];
|
||||
sub esp, 12;
|
||||
mov dword ptr [esp],0;
|
||||
mov dword ptr [esp+4],0x80000000;
|
||||
fisub dword ptr [a];
|
||||
mov eax, dword ptr [a];
|
||||
add eax, 0x3fff;
|
||||
mov [esp+8], eax;
|
||||
// jle underflow;
|
||||
// cmp eax, 0x8000;
|
||||
// jge overflow;
|
||||
f2xm1;
|
||||
fld1;
|
||||
fadd;
|
||||
fld tbyte ptr [esp];
|
||||
add esp, 12;
|
||||
fmul;
|
||||
//jmp end;
|
||||
|
||||
// underflow:
|
||||
// fstp st;
|
||||
// fldz;
|
||||
// add esp, 12;
|
||||
// jmp end;
|
||||
|
||||
//overflow:
|
||||
// push 0x7f800000;
|
||||
// fstp st;
|
||||
// fld dword ptr [esp];
|
||||
// add esp, 16;
|
||||
// jmp end;
|
||||
|
||||
//zero:
|
||||
// fstp st(1);
|
||||
|
||||
//end:
|
||||
}
|
||||
//return st;
|
||||
}
|
||||
#endif
|
||||
|
||||
void mymemcpy(void* av_Dest_, const void* av_Src_, size_t ai_Size)
|
||||
{
|
||||
__asm mov esi, av_Src_
|
||||
__asm mov edi, av_Dest_
|
||||
__asm mov ecx, ai_Size
|
||||
__asm rep movsb
|
||||
}
|
||||
|
||||
void mymemset(void* dest, const char value, size_t ai_size)
|
||||
{
|
||||
__asm mov al, value
|
||||
__asm mov edi, dest
|
||||
__asm mov ecx, ai_size
|
||||
__asm rep stosb
|
||||
}
|
||||
|
||||
void mymemzero(void* dest, size_t ai_size)
|
||||
{
|
||||
__asm xor al, al
|
||||
__asm mov edi, dest
|
||||
__asm mov ecx, ai_size
|
||||
__asm rep stosb
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
double __cdecl sin(double);
|
||||
double __cdecl cos(double);
|
||||
double __cdecl sqrt(double);
|
||||
double __cdecl fabs(double);
|
||||
|
||||
void* __cdecl memcpy( void* dest, const void* src, size_t count );
|
||||
}
|
||||
|
||||
#pragma intrinsic ( sin, cos, sqrt, fabs ) // true intrinsic
|
||||
#pragma intrinsic ( memcpy ) // true intrinsic
|
||||
|
||||
/*
|
||||
__forceinline double sin(double v)
|
||||
{
|
||||
__asm fld v;
|
||||
__asm fsin;
|
||||
__asm fstp v;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
float cos(float v)
|
||||
{
|
||||
__asm fld v;
|
||||
__asm fcos;
|
||||
__asm fstp v;
|
||||
return v;
|
||||
}
|
||||
*/
|
||||
/*float sqrt(float v)
|
||||
{
|
||||
__asm finit;
|
||||
__asm fld v;
|
||||
__asm fsqrt;
|
||||
__asm fstp v;
|
||||
return v;
|
||||
}*/
|
||||
|
||||
/*float abs(float X)
|
||||
{
|
||||
if(X < 0.0f)
|
||||
return -X;
|
||||
|
||||
return X;
|
||||
}*/
|
||||
|
||||
float maximum(float X, float Y)
|
||||
{
|
||||
if(X < Y)
|
||||
return Y;
|
||||
|
||||
return X;
|
||||
}
|
||||
|
||||
float minimum(float X, float Y)
|
||||
{
|
||||
if(X > Y)
|
||||
return Y;
|
||||
|
||||
return X;
|
||||
}
|
||||
|
||||
float signpow( float a, float b )
|
||||
{
|
||||
float fSign= ( a < 0.0f ? -1.0f : 1.0f );
|
||||
return fSign * (float)mypow( (float)fabs( (float)a ), b );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user