port from perforce
This commit is contained in:
128
4kgfx/small.h
Normal file
128
4kgfx/small.h
Normal file
@@ -0,0 +1,128 @@
|
||||
#pragma once
|
||||
|
||||
#pragma code_seg("pi")
|
||||
__forceinline float pi()
|
||||
{
|
||||
__asm fldpi
|
||||
}
|
||||
|
||||
#pragma code_seg("sm0")
|
||||
|
||||
unsigned long ftol(float Value)
|
||||
{
|
||||
unsigned long RetVal;
|
||||
__asm fld Value
|
||||
__asm fistp RetVal
|
||||
return RetVal;
|
||||
}
|
||||
|
||||
#pragma code_seg("sm1")
|
||||
|
||||
float frac(float Value)
|
||||
{
|
||||
return Value - ftol(Value);
|
||||
}
|
||||
|
||||
#pragma code_seg("sm2")
|
||||
|
||||
float abs(float Value)
|
||||
{
|
||||
__asm fld Value
|
||||
__asm fabs
|
||||
}
|
||||
|
||||
#pragma code_seg("sm3")
|
||||
|
||||
float sin(float Value)
|
||||
{
|
||||
__asm fld Value
|
||||
__asm fsin
|
||||
}
|
||||
|
||||
#pragma code_seg("sm4")
|
||||
|
||||
float sign(float Value)
|
||||
{
|
||||
if (Value != 0)
|
||||
return Value / abs(Value);
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
#pragma code_seg("sm5")
|
||||
|
||||
float sqrt(float Value)
|
||||
{
|
||||
__asm fld Value
|
||||
__asm fsqrt
|
||||
}
|
||||
|
||||
#pragma code_seg("sm7")
|
||||
|
||||
void* memcpy(void* Dest, const void* Src, size_t destSize)
|
||||
{
|
||||
__asm mov esi, Src
|
||||
__asm mov edi, Dest
|
||||
__asm mov ecx, destSize
|
||||
__asm rep movsb
|
||||
}
|
||||
|
||||
#pragma code_seg("sm8")
|
||||
|
||||
float fmod(float x, float y)
|
||||
{
|
||||
__asm fld y
|
||||
__asm fld x
|
||||
__asm fprem
|
||||
__asm fxch
|
||||
__asm fstp x
|
||||
}
|
||||
|
||||
#pragma data_seg("smA")
|
||||
|
||||
static unsigned long seed=0x12345678;
|
||||
|
||||
#pragma code_seg("sm9")
|
||||
|
||||
__forceinline void randomize(unsigned long x)
|
||||
{
|
||||
seed = x;
|
||||
}
|
||||
|
||||
#pragma code_seg("smB")
|
||||
|
||||
float rand()
|
||||
{
|
||||
seed = seed * 0x76364873 + 1234567;
|
||||
return (float)(seed & 0x7FFFFFFF) * (const float)(2.0f / (float)0x7FFFFFFF) - 1.0f;
|
||||
}
|
||||
|
||||
#pragma code_seg("smS")
|
||||
|
||||
__forceinline size_t strlen(const char* String)
|
||||
{
|
||||
size_t Length = 0;
|
||||
while (*String++) ++Length;
|
||||
return Length;
|
||||
}
|
||||
|
||||
#pragma code_seg("smP")
|
||||
|
||||
float pow(float x, float y){
|
||||
float r;
|
||||
__asm{
|
||||
fld y
|
||||
fld x
|
||||
fyl2x
|
||||
fld1
|
||||
fld st(1)
|
||||
fprem
|
||||
f2xm1
|
||||
faddp st(1),st
|
||||
fscale
|
||||
fxch st(1)
|
||||
fstp st(0)
|
||||
fstp r
|
||||
}
|
||||
return r;
|
||||
}
|
||||
Reference in New Issue
Block a user