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

}

