Files
tlib/oversampling/WDL/eel2/asm-nseel-x86-msvc.c
2024-05-24 13:28:31 +02:00

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;
}
}