3018 lines
42 KiB
C
3018 lines
42 KiB
C
// THIS FILE AUTOGENERATED FROM asm-nseel-x86-gcc.c by a2i.php
|
|
|
|
|
|
void nseel_asm_1pdd(void)
|
|
{
|
|
__asm {
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edi, 0xfefefefe;
|
|
sub esp, 16;
|
|
fstp qword ptr [esp];
|
|
call edi;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
}
|
|
}
|
|
|
|
void nseel_asm_2pdd(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edi, 0xfefefefe;
|
|
sub esp, 16;
|
|
fstp qword ptr [esp+8];
|
|
fstp qword ptr [esp];
|
|
call edi;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_2pdds(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov eax, 0xfefefefe;
|
|
sub esp, 8;
|
|
fstp qword ptr [esp];
|
|
push dword ptr [edi+4]; /* push parameter */
|
|
push dword ptr [edi]; /* push the rest of the parameter */
|
|
call eax;
|
|
add esp, 16;
|
|
fstp qword ptr [edi]; /* store result */
|
|
mov eax, edi; /* set return value */
|
|
|
|
// denormal-fix result (this is only currently used for pow_op, so we want this!)
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
jg label_0;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_0:
|
|
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
void nseel_asm_invsqrt(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edx, 0x5f3759df;
|
|
fst dword ptr [esi];
|
|
_emit 0xDC; // fmul qword ptr [0xfefefefe]
|
|
_emit 0x0D;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
mov ecx, dword ptr [esi];
|
|
sar ecx, 1;
|
|
sub edx, ecx;
|
|
mov dword ptr [esi], edx;
|
|
fmul dword ptr [esi];
|
|
fmul dword ptr [esi];
|
|
_emit 0xDC; // fadd qword ptr [0xfefefefe]
|
|
_emit 0x05;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
_emit 0xFE;
|
|
fmul dword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_dbg_getstackptr(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
ffree st(0);
|
|
#else
|
|
fstp st(0);
|
|
#endif
|
|
mov dword ptr [esi], esp;
|
|
fild dword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_sin(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fsin;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_cos(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcos;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_tan(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fptan;
|
|
fstp st(0);
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_sqr(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fmul st(0), st(0);
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_sqrt(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fabs;
|
|
fsqrt;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_log(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fldln2;
|
|
fxch;
|
|
fyl2x;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_log10(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fldlg2;
|
|
fxch;
|
|
fyl2x;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_abs(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fabs;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_assign(void)
|
|
{
|
|
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov ecx, dword ptr [eax];
|
|
mov edx, dword ptr [eax+4];
|
|
mov eax, edx;
|
|
add eax, 0x00100000; // if exponent is zero, make exponent 0x7ff, if 7ff, make 7fe
|
|
and eax, 0x7ff00000;
|
|
cmp eax, 0x00200000;
|
|
jg label_1;
|
|
sub ecx, ecx;
|
|
sub edx, edx;
|
|
label_1:
|
|
|
|
mov eax, edi;
|
|
mov dword ptr [edi], ecx;
|
|
mov dword ptr [edi+4], edx;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_assign_fromfp(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fstp qword ptr [edi];
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
mov eax, edi;
|
|
jg label_2;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_2:
|
|
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_assign_fast_fromfp(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_assign_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov ecx, dword ptr [eax];
|
|
mov dword ptr [edi], ecx;
|
|
mov ecx, dword ptr [eax+4];
|
|
|
|
mov eax, edi;
|
|
mov dword ptr [edi+4], ecx;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_add(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
faddp st(1);
|
|
#else
|
|
fadd;
|
|
#endif
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_add_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fadd qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
jg label_3;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_3:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_add_op_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fadd qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_sub(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
fsubrp st(1), st(0);
|
|
#else
|
|
#ifdef __GNUC__
|
|
#ifdef __INTEL_COMPILER
|
|
fsub;
|
|
#else
|
|
fsubr; // gnuc has fsub/fsubr backwards, ack
|
|
#endif
|
|
#else
|
|
fsub;
|
|
#endif
|
|
#endif
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_sub_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fsubr qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
jg label_4;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_4:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_sub_op_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fsubr qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_mul(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
fmulp st(1), st(0);
|
|
#else
|
|
fmul;
|
|
#endif
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_mul_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fmul qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
jg label_5;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_5:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_mul_op_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fmul qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_div(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
fdivrp st(1);
|
|
#else
|
|
#ifdef __GNUC__
|
|
#ifdef __INTEL_COMPILER
|
|
fdiv;
|
|
#else
|
|
fdivr; // gcc inline asm seems to have fdiv/fdivr backwards
|
|
#endif
|
|
#else
|
|
fdiv;
|
|
#endif
|
|
#endif
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_div_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
#ifdef __clang__
|
|
fdivp st(1);
|
|
#else
|
|
#ifndef __GNUC__
|
|
fdivr;
|
|
#else
|
|
#ifdef __INTEL_COMPILER
|
|
fdivp st(1);
|
|
#else
|
|
fdiv;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
mov edx, dword ptr [edi+4];
|
|
add edx, 0x00100000;
|
|
and edx, 0x7FF00000;
|
|
cmp edx, 0x00200000;
|
|
jg label_6;
|
|
sub edx, edx;
|
|
mov dword ptr [edi], edx;
|
|
mov dword ptr [edi+4], edx;
|
|
label_6:
|
|
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_div_op_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
#ifdef __clang__
|
|
fdivp st(1);
|
|
#else
|
|
#ifndef __GNUC__
|
|
fdivr;
|
|
#else
|
|
#ifdef __INTEL_COMPILER
|
|
fdivp st(1);
|
|
#else
|
|
fdiv;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_mod(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fabs;
|
|
fistp dword ptr [esi];
|
|
fabs;
|
|
fistp dword ptr [esi+4];
|
|
xor edx, edx;
|
|
cmp dword ptr [esi], 0;
|
|
je label_7; // skip devide, set return to 0
|
|
mov eax, dword ptr [esi+4];
|
|
div dword ptr [esi];
|
|
label_7:
|
|
|
|
mov dword ptr [esi], edx;
|
|
fild dword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_shl(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp dword ptr [esi];
|
|
fistp dword ptr [esi+4];
|
|
mov ecx, dword ptr [esi];
|
|
mov eax, dword ptr [esi+4];
|
|
shl eax, cl;
|
|
mov dword ptr [esi], eax;
|
|
fild dword ptr [esi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_shr(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp dword ptr [esi];
|
|
fistp dword ptr [esi+4];
|
|
mov ecx, dword ptr [esi];
|
|
mov eax, dword ptr [esi+4];
|
|
sar eax, cl;
|
|
mov dword ptr [esi], eax;
|
|
fild dword ptr [esi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_mod_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fxch;
|
|
fabs;
|
|
fistp dword ptr [edi];
|
|
fabs;
|
|
fistp dword ptr [esi];
|
|
xor edx, edx;
|
|
cmp dword ptr [edi], 0;
|
|
je label_8; // skip devide, set return to 0
|
|
mov eax, dword ptr [esi];
|
|
div dword ptr [edi];
|
|
label_8:
|
|
|
|
mov dword ptr [edi], edx;
|
|
fild dword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_or(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp qword ptr [esi];
|
|
fistp qword ptr [esi+8];
|
|
mov edi, dword ptr [esi+8];
|
|
mov ecx, dword ptr [esi+12];
|
|
or dword ptr [esi], edi;
|
|
or dword ptr [esi+4], ecx;
|
|
fild qword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_or0(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp qword ptr [esi];
|
|
fild qword ptr [esi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_or_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fxch;
|
|
fistp qword ptr [edi];
|
|
fistp qword ptr [esi];
|
|
mov eax, dword ptr [esi];
|
|
mov ecx, dword ptr [esi+4];
|
|
or dword ptr [edi], eax;
|
|
or dword ptr [edi+4], ecx;
|
|
fild qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_xor(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp qword ptr [esi];
|
|
fistp qword ptr [esi+8];
|
|
mov edi, dword ptr [esi+8];
|
|
mov ecx, dword ptr [esi+12];
|
|
xor dword ptr [esi], edi;
|
|
xor dword ptr [esi+4], ecx;
|
|
fild qword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_xor_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fxch;
|
|
fistp qword ptr [edi];
|
|
fistp qword ptr [esi];
|
|
mov eax, dword ptr [esi];
|
|
mov ecx, dword ptr [esi+4];
|
|
xor dword ptr [edi], eax;
|
|
xor dword ptr [edi+4], ecx;
|
|
fild qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_and(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fistp qword ptr [esi];
|
|
fistp qword ptr [esi+8];
|
|
mov edi, dword ptr [esi+8];
|
|
mov ecx, dword ptr [esi+12];
|
|
and dword ptr [esi], edi;
|
|
and dword ptr [esi+4], ecx;
|
|
fild qword ptr [esi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_and_op(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fxch;
|
|
fistp qword ptr [edi];
|
|
fistp qword ptr [esi];
|
|
mov eax, dword ptr [esi];
|
|
mov ecx, dword ptr [esi+4];
|
|
and dword ptr [edi], eax;
|
|
and dword ptr [edi+4], ecx;
|
|
fild qword ptr [edi];
|
|
mov eax, edi;
|
|
fstp qword ptr [edi];
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_uminus(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fchs;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_sign(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
fst dword ptr [esi];
|
|
mov ecx, dword ptr [esi];
|
|
mov edx, 0x7FFFFFFF;
|
|
test ecx, edx;
|
|
jz label_9; // zero zero, return the value passed directly
|
|
// calculate sign
|
|
inc edx; // edx becomes 0x8000...
|
|
fstp st(0);
|
|
fld1;
|
|
test ecx, edx;
|
|
jz label_9;
|
|
fchs;
|
|
label_9:
|
|
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_bnot(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
test eax, eax;
|
|
setz al;
|
|
and eax, 0xff;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_fcall(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edx, 0xfefefefe;
|
|
sub esp, 12; /* keep stack 16 byte aligned, 4 bytes for return address */
|
|
call edx;
|
|
add esp, 12;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_band(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
test eax, eax;
|
|
jz label_10;
|
|
|
|
mov ecx, 0xfefefefe;
|
|
sub esp, 12;
|
|
call ecx;
|
|
add esp, 12;
|
|
label_10:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_bor(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
test eax, eax;
|
|
jnz label_11;
|
|
|
|
mov ecx, 0xfefefefe;
|
|
sub esp, 12;
|
|
call ecx;
|
|
add esp, 12;
|
|
label_11:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_equal(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
fsubp st(1);
|
|
#else
|
|
fsub;
|
|
#endif
|
|
|
|
fabs;
|
|
fcomp qword ptr [ebx+-8]; //[g_closefact]
|
|
fstsw ax;
|
|
and eax, 256; // old behavior: if 256 set, true (NaN means true)
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
//
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_equal_exact(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcompp;
|
|
fstsw ax; // for equal 256 and 1024 should be clear, 16384 should be set
|
|
and eax, 17664; // mask C4/C3/C1, bits 8/10/14, 16384|256|1024 -- if equals 16384, then equality
|
|
cmp eax, 16384;
|
|
je label_12;
|
|
sub eax, eax;
|
|
label_12:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_notequal_exact(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcompp;
|
|
fstsw ax; // for equal 256 and 1024 should be clear, 16384 should be set
|
|
and eax, 17664; // mask C4/C3/C1, bits 8/10/14, 16384|256|1024 -- if equals 16384, then equality
|
|
cmp eax, 16384;
|
|
je label_13;
|
|
sub eax, eax;
|
|
label_13:
|
|
|
|
xor eax, 16384; // flip the result
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
//
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_notequal(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
#ifdef __clang__
|
|
fsubp st(1);
|
|
#else
|
|
fsub;
|
|
#endif
|
|
|
|
fabs;
|
|
fcomp qword ptr [ebx+-8]; //[g_closefact]
|
|
fstsw ax;
|
|
and eax, 256;
|
|
xor eax, 256; // old behavior: if 256 set, FALSE (NaN makes for false)
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_above(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcompp;
|
|
fstsw ax;
|
|
and eax, 1280; // (1024+256) old behavior: NaN would mean 1, preserve that
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
void nseel_asm_beloweq(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcompp;
|
|
fstsw ax;
|
|
and eax, 256; // old behavior: NaN would be 0 (ugh)
|
|
xor eax, 256;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_booltofp(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
test eax, eax;
|
|
jz label_14;
|
|
fld1;
|
|
jmp label_15;
|
|
label_14:
|
|
|
|
fldz;
|
|
label_15:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_fptobool(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fabs;
|
|
fcomp qword ptr [ebx+-8]; //[g_closefact]
|
|
fstsw ax;
|
|
and eax, 256;
|
|
xor eax, 256;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_fptobool_rev(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fabs;
|
|
fcomp qword ptr [ebx+-8]; //[g_closefact]
|
|
fstsw ax;
|
|
and eax, 256;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_min(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fcomp qword ptr [eax];
|
|
mov ecx, eax;
|
|
fstsw ax;
|
|
test eax, 256;
|
|
mov eax, ecx;
|
|
jz label_16;
|
|
mov eax, edi;
|
|
label_16:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|
|
void nseel_asm_max(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fld qword ptr [edi];
|
|
fcomp qword ptr [eax];
|
|
mov ecx, eax;
|
|
fstsw ax;
|
|
test eax, 256;
|
|
mov eax, ecx;
|
|
jnz label_17;
|
|
mov eax, edi;
|
|
label_17:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void nseel_asm_min_fp(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcom;
|
|
fstsw ax;
|
|
test eax, 256;
|
|
jz label_18;
|
|
fxch;
|
|
label_18:
|
|
|
|
fstp st(0);
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|
|
void nseel_asm_max_fp(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
fcom;
|
|
fstsw ax;
|
|
test eax, 256;
|
|
jnz label_19;
|
|
fxch;
|
|
label_19:
|
|
|
|
fstp st(0);
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// just generic functions left, yay
|
|
|
|
|
|
|
|
|
|
void _asm_generic3parm(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edx, 0xfefefefe;
|
|
push eax; // push parameter
|
|
push edi; // push parameter
|
|
mov edi, 0xfefefefe;
|
|
push ecx; // push parameter
|
|
push edx; // push context pointer
|
|
call edi;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void _asm_generic3parm_retd(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
sub esp, 16;
|
|
mov edx, 0xfefefefe;
|
|
mov dword ptr [esp+8], edi;
|
|
mov edi, 0xfefefefe;
|
|
mov dword ptr [esp+12], eax;
|
|
mov dword ptr [esp+4], ecx;
|
|
mov dword ptr [esp], edx;
|
|
call edi;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void _asm_generic2parm(void) // this prob neds to be fixed for ppc
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edx, 0xfefefefe;
|
|
mov ecx, 0xfefefefe;
|
|
sub esp, 4; // keep stack aligned
|
|
push eax; // push parameter
|
|
push edi; // push parameter
|
|
push edx; // push context pointer
|
|
call ecx;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void _asm_generic2parm_retd(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
sub esp, 16;
|
|
mov edx, 0xfefefefe;
|
|
mov ecx, 0xfefefefe;
|
|
mov dword ptr [esp], edx;
|
|
mov dword ptr [esp+4], edi;
|
|
mov dword ptr [esp+8], eax;
|
|
call ecx;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void _asm_generic2xparm_retd(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
sub esp, 16;
|
|
mov edx, 0xfefefefe; // first parameter
|
|
mov dword ptr [esp], edx;
|
|
mov dword ptr [esp+8], edi;
|
|
mov edx, 0xfefefefe;
|
|
mov ecx, 0xfefefefe; // function
|
|
mov dword ptr [esp+4], edx;
|
|
mov dword ptr [esp+12], eax;
|
|
call ecx;
|
|
add esp, 16;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _asm_generic1parm(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edx, 0xfefefefe;
|
|
sub esp, 8; // keep stack aligned
|
|
mov ecx, 0xfefefefe;
|
|
push eax; // push parameter
|
|
push edx; // push context pointer
|
|
call ecx;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void _asm_generic1parm_retd(void) // 1 parameter returning double
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
mov edx, 0xfefefefe; // context pointer
|
|
mov ecx, 0xfefefefe; // func-addr
|
|
sub esp, 16;
|
|
mov dword ptr [esp+4], eax; // push parameter
|
|
mov dword ptr [esp], edx; // push context pointer
|
|
call ecx;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// this gets its own stub because it's pretty crucial for performance :/
|
|
|
|
void _asm_megabuf(void)
|
|
{
|
|
__asm {
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
fadd qword ptr [ebx+-8];
|
|
fistp dword ptr [esi];
|
|
|
|
// check if (%esi) is in range, and buffer available, otherwise call function
|
|
mov edi, dword ptr [esi];
|
|
cmp edi, ((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK)); //REPLACE=((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK))
|
|
jae label_20;
|
|
|
|
mov eax, edi;
|
|
shr eax, (NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 2/*log2(sizeof(void *))*/ ); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 2/*log2(sizeof(void *))*/ )
|
|
and eax, ((NSEEL_RAM_BLOCKS-1)*4 /*sizeof(void*)*/ ); //REPLACE=((NSEEL_RAM_BLOCKS-1)*4 /*sizeof(void*)*/ )
|
|
mov eax, dword ptr [ebx+eax];
|
|
test eax, eax;
|
|
jnz label_21;
|
|
label_20:
|
|
|
|
sub esp, 8; // keep stack aligned
|
|
mov ecx, 0xfefefefe;
|
|
push edi; // parameter
|
|
push ebx; // push context pointer
|
|
call ecx;
|
|
add esp, 16;
|
|
jmp label_22;
|
|
label_21:
|
|
|
|
and edi, (NSEEL_RAM_ITEMSPERBLOCK-1); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK-1)
|
|
shl edi, 3; // 3 is log2(sizeof(EEL_F))
|
|
add eax, edi;
|
|
label_22:
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
#ifndef _MSC_VER
|
|
:: i; (((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK))),
|
|
i; ((NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 2/*log2(sizeof(void *))*/ )),
|
|
i; (((NSEEL_RAM_BLOCKS-1)*4 /*sizeof(void*)*/ )),
|
|
i; ((NSEEL_RAM_ITEMSPERBLOCK-1 ))
|
|
#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _asm_gmegabuf(void)
|
|
{
|
|
__asm {
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
|
|
sub esp, 16; // keep stack aligned
|
|
mov dword ptr [esp], 0xfefefefe;
|
|
fadd qword ptr [ebx+-8];
|
|
mov edi, 0xfefefefe;
|
|
fistp dword ptr [esp+4];
|
|
call edi;
|
|
add esp, 16;
|
|
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_stack_push(void)
|
|
{
|
|
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
|
|
mov ecx, dword ptr [eax];
|
|
mov edx, dword ptr [eax+4];
|
|
|
|
mov eax, dword ptr [edi];
|
|
|
|
add eax, 8;
|
|
and eax, 0xfefefefe;
|
|
or eax, 0xfefefefe;
|
|
|
|
mov dword ptr [eax], ecx;
|
|
mov dword ptr [eax+4], edx;
|
|
|
|
mov dword ptr [edi], eax;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void nseel_asm_stack_pop(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
mov ecx, dword ptr [edi];
|
|
fld qword ptr [ecx];
|
|
sub ecx, 8;
|
|
and ecx, 0xfefefefe;
|
|
or ecx, 0xfefefefe;
|
|
mov dword ptr [edi], ecx;
|
|
fstp qword ptr [eax];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_stack_pop_fast(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
mov ecx, dword ptr [edi];
|
|
mov eax, ecx;
|
|
sub ecx, 8;
|
|
and ecx, 0xfefefefe;
|
|
or ecx, 0xfefefefe;
|
|
mov dword ptr [edi], ecx;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
void nseel_asm_stack_peek_int(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
mov eax, dword ptr [edi];
|
|
mov edx, 0xfefefefe;
|
|
sub eax, edx;
|
|
and eax, 0xfefefefe;
|
|
or eax, 0xfefefefe;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void nseel_asm_stack_peek(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
fistp dword ptr [esi];
|
|
mov eax, dword ptr [edi];
|
|
mov edx, dword ptr [esi];
|
|
shl edx, 3; // log2(sizeof(EEL_F))
|
|
sub eax, edx;
|
|
and eax, 0xfefefefe;
|
|
or eax, 0xfefefefe;
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
}
|
|
|
|
|
|
void nseel_asm_stack_peek_top(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
mov eax, dword ptr [edi];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|
|
void nseel_asm_stack_exch(void)
|
|
{
|
|
__asm {
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
mov edi, 0xfefefefe;
|
|
mov ecx, dword ptr [edi];
|
|
fld qword ptr [ecx];
|
|
fld qword ptr [eax];
|
|
fstp qword ptr [ecx];
|
|
fstp qword ptr [eax];
|
|
_emit 0x89;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
_emit 0x90;
|
|
}
|
|
|
|
}
|
|
|