winamp/Src/ns-eel2/asm-nseel-x86-msvc.c

4102 lines
65 KiB
C
Raw Normal View History

2024-09-24 14:54:57 +02:00
// THIS FILE AUTOGENERATED FROM asm-nseel-x86-gcc.c by a2i.php
#if EEL_F_SIZE == 8
#define EEL_ASM_TYPE qword ptr
#else
#define EEL_ASM_TYPE dword ptr
#endif
/* note: only EEL_F_SIZE=8 is now supported (no float EEL_F's) */
#ifndef AMD64ABI
#define X64_EXTRA_STACK_SPACE 32 // win32 requires allocating space for 4 parameters at 8 bytes each, even though we pass via register
#endif
__declspec(naked) 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;
#ifdef TARGET_X64
fstp qword ptr [rsi];
movq xmm0, [rsi];
#ifdef AMD64ABI
mov r15, rsi;
call edi;
mov rsi, r15;
#else
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
movq [rsi], xmm0;
fld qword ptr [rsi];
#else
sub esp, 16;
fstp qword ptr [esp];
call edi;
add esp, 16;
#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;
}
}
__declspec(naked) void nseel_asm_1pdd_end(void){}
__declspec(naked) 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;
#ifdef TARGET_X64
fstp qword ptr [rsi+8];
fstp qword ptr [rsi];
movq xmm1, [rsi+8];
movq xmm0, [rsi];
#ifdef AMD64ABI
mov r15, rsi;
call edi;
mov rsi, r15;
#else
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
movq [rsi], xmm0;
fld qword ptr [rsi];
#else
sub esp, 16;
fstp qword ptr [esp+8];
fstp qword ptr [esp];
call edi;
add esp, 16;
#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;
}
}
__declspec(naked) void nseel_asm_2pdd_end(void){}
__declspec(naked) 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;
#ifdef TARGET_X64
fstp qword ptr [rsi];
movq xmm0, [rdi];
movq xmm1, [rsi];
#ifdef AMD64ABI
mov r15, rsi;
mov r14, rdi;
call eax;
mov rdi, r14; /* restore thrashed rdi */
mov rsi, r15;
mov rax, r14; /* set return value */
movq [r14], xmm0;
#else
sub rsp, X64_EXTRA_STACK_SPACE;
call eax;
movq [edi], xmm0;
mov eax, edi; /* set return value */
add rsp, X64_EXTRA_STACK_SPACE;
#endif
#else
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 */
#endif
// 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, 0x00100000;
jg label_0;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_2pdds_end(void){}
//---------------------------------------------------------------------------------------------------------------
// do nothing, eh
__declspec(naked) void nseel_asm_exec2(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;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_exec2_end(void) { }
__declspec(naked) 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];
#ifdef TARGET_X64
mov rax, 0xfefefefe;
fmul EEL_ASM_TYPE [rax];
movsx rcx, dword ptr [esi];
#else
#if EEL_F_SIZE == 8
_emit 0xDC; // fmul qword ptr [0xfefefefe]
_emit 0x0D;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
#else
_emit 0xD8; // fmul dword ptr [0xfefefefe]
_emit 0x0D;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
#endif
mov ecx, dword ptr [esi];
#endif
sar ecx, 1;
sub edx, ecx;
mov dword ptr [esi], edx;
fmul dword ptr [esi];
fmul dword ptr [esi];
#ifdef TARGET_X64
mov rax, 0xfefefefe;
fadd EEL_ASM_TYPE [rax];
#else
#if EEL_F_SIZE == 8
_emit 0xDC; // fadd qword ptr [0xfefefefe]
_emit 0x05;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
#else
_emit 0xD8; // fadd dword ptr [0xfefefefe]
_emit 0x05;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
_emit 0xFE;
#endif
#endif
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;
}
}
__declspec(naked) void nseel_asm_invsqrt_end(void) {}
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_dbg_getstackptr_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_sin_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_cos_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_tan_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_sqr_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_sqrt_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_log_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_log10_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_abs_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) void nseel_asm_assign(void)
{
#ifdef TARGET_X64
__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 rdx, qword ptr [rax];
mov rcx, rdx;
shr rdx, 32;
add edx, 0x00100000;
and edx, 0x7FF00000;
cmp edx, 0x00100000;
mov rax, rdi;
jg label_1;
sub ecx, ecx;
label_1:
mov qword ptr [edi], rcx;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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, 0x00100000;
jg label_2;
sub ecx, ecx;
sub edx, edx;
label_2:
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;
}
#endif
}
__declspec(naked) void nseel_asm_assign_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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, 0x00100000;
mov eax, edi;
jg label_3;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_assign_fromfp_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_assign_fast_fromfp_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) void nseel_asm_assign_fast(void)
{
#ifdef TARGET_X64
__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 rdx, qword ptr [rax];
mov qword ptr [edi], rdx;
mov rax, rdi;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_assign_fast_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_add_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [edi];
mov edx, dword ptr [edi+4];
add edx, 0x00100000;
and edx, 0x7FF00000;
cmp edx, 0x00100000;
jg label_4;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_add_op_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_add_op_fast_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_sub_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [edi];
mov edx, dword ptr [edi+4];
add edx, 0x00100000;
and edx, 0x7FF00000;
cmp edx, 0x00100000;
jg label_5;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_sub_op_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_sub_op_fast_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_mul_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [edi];
mov edx, dword ptr [edi+4];
add edx, 0x00100000;
and edx, 0x7FF00000;
cmp edx, 0x00100000;
jg label_6;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_mul_op_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_mul_op_fast_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_div_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [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 EEL_ASM_TYPE [edi];
mov edx, dword ptr [edi+4];
add edx, 0x00100000;
and edx, 0x7FF00000;
cmp edx, 0x00100000;
jg label_7;
sub edx, edx;
#ifdef TARGET_X64
mov qword ptr [rdi], rdx;
#else
mov dword ptr [edi], edx;
mov dword ptr [edi+4], edx;
#endif
label_7:
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_div_op_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [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 EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_div_op_fast_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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_8; // skip devide, set return to 0
mov eax, dword ptr [esi+4];
div dword ptr [esi];
label_8:
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;
}
}
__declspec(naked) void nseel_asm_mod_end(void) {}
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_shl_end(void) {}
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_shr_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fxch;
fabs;
fistp dword ptr [edi];
fabs;
fistp dword ptr [esi];
xor edx, edx;
cmp dword ptr [edi], 0;
je label_9; // skip devide, set return to 0
mov eax, dword ptr [esi];
div dword ptr [edi];
label_9:
mov dword ptr [edi], edx;
fild dword ptr [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_mod_op_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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];
#ifdef TARGET_X64
mov rdi, qword ptr [rsi+8];
or qword ptr [rsi], rdi;
#else
mov edi, dword ptr [esi+8];
mov ecx, dword ptr [esi+12];
or dword ptr [esi], edi;
or dword ptr [esi+4], ecx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_or_end(void) {}
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_or0_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fxch;
fistp qword ptr [edi];
fistp qword ptr [esi];
#ifdef TARGET_X64
mov rax, qword ptr [rsi];
or qword ptr [rdi], rax;
#else
mov eax, dword ptr [esi];
mov ecx, dword ptr [esi+4];
or dword ptr [edi], eax;
or dword ptr [edi+4], ecx;
#endif
fild qword ptr [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_or_op_end(void) {}
__declspec(naked) 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];
#ifdef TARGET_X64
mov rdi, qword ptr [rsi+8];
xor qword ptr [rsi], rdi;
#else
mov edi, dword ptr [esi+8];
mov ecx, dword ptr [esi+12];
xor dword ptr [esi], edi;
xor dword ptr [esi+4], ecx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_xor_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fxch;
fistp qword ptr [edi];
fistp qword ptr [esi];
#ifdef TARGET_X64
mov rax, qword ptr [rsi];
xor qword ptr [rdi], rax;
#else
mov eax, dword ptr [esi];
mov ecx, dword ptr [esi+4];
xor dword ptr [edi], eax;
xor dword ptr [edi+4], ecx;
#endif
fild qword ptr [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_xor_op_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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];
#ifdef TARGET_X64
mov rdi, qword ptr [rsi+8];
and qword ptr [rsi], rdi;
#else
mov edi, dword ptr [esi+8];
mov ecx, dword ptr [esi+12];
and dword ptr [esi], edi;
and dword ptr [esi+4], ecx;
#endif
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;
}
}
__declspec(naked) void nseel_asm_and_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fxch;
fistp qword ptr [edi];
fistp qword ptr [esi];
#ifdef TARGET_X64
mov rax, qword ptr [rsi];
and qword ptr [rdi], rax;
#else
mov eax, dword ptr [esi];
mov ecx, dword ptr [esi+4];
and dword ptr [edi], eax;
and dword ptr [edi+4], ecx;
#endif
fild qword ptr [edi];
mov eax, edi;
fstp EEL_ASM_TYPE [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;
}
}
__declspec(naked) void nseel_asm_and_op_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) void nseel_asm_uplus(void) // this is the same as doing nothing, it seems
{
__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;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_uplus_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_uminus_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
#ifdef TARGET_X64
fst EEL_ASM_TYPE [rsi];
mov rdx, EEL_ASM_TYPE [rsi];
mov rcx, 0x7FFFFFFFFFFFFFFF;
test rdx, rcx;
jz label_10; // zero zero, return the value passed directly
// calculate sign
inc rcx; // rcx becomes 0x80000...
fstp st(0);
fld1;
test rdx, rcx;
jz label_10;
fchs;
label_10:
#else
fst dword ptr [esi];
mov ecx, dword ptr [esi];
mov edx, 0x7FFFFFFF;
test ecx, edx;
jz label_11; // zero zero, return the value passed directly
// calculate sign
inc edx; // edx becomes 0x8000...
fstp st(0);
fld1;
test ecx, edx;
jz label_11;
fchs;
label_11:
#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;
}
}
__declspec(naked) void nseel_asm_sign_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_bnot_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
#ifdef TARGET_X64
sub esp, 8;
call edx;
add esp, 8;
#else
sub esp, 12; /* keep stack 16 byte aligned, 4 bytes for return address */
call edx;
add esp, 12;
#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;
}
}
__declspec(naked) void nseel_asm_fcall_end(void) {}
__declspec(naked) 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_12;
mov ecx, 0xfefefefe;
#ifdef TARGET_X64
sub rsp, 8;
#else
sub esp, 12;
#endif
call ecx;
#ifdef TARGET_X64
add rsp, 8;
#else
add esp, 12;
#endif
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;
}
}
__declspec(naked) void nseel_asm_band_end(void) {}
__declspec(naked) 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_13;
mov ecx, 0xfefefefe;
#ifdef TARGET_X64
sub rsp, 8;
#else
sub esp, 12;
#endif
call ecx;
#ifdef TARGET_X64
add rsp, 8;
#else
add esp, 12;
#endif
label_13:
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_bor_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
#ifdef TARGET_X64
fcomp EEL_ASM_TYPE [r12+-8]; //[g_closefact]
#else
fcomp EEL_ASM_TYPE [ebx+-8]; //[g_closefact]
#endif
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;
}
}
__declspec(naked) void nseel_asm_equal_end(void) {}
//
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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_14;
sub eax, eax;
label_14:
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_equal_exact_end(void) {}
__declspec(naked) 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_15;
sub eax, eax;
label_15:
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;
}
}
__declspec(naked) void nseel_asm_notequal_exact_end(void) {}
//
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
#ifdef TARGET_X64
fcomp EEL_ASM_TYPE [r12+-8]; //[g_closefact]
#else
fcomp EEL_ASM_TYPE [ebx+-8]; //[g_closefact]
#endif
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;
}
}
__declspec(naked) void nseel_asm_notequal_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_above_end(void) {}
//---------------------------------------------------------------------------------------------------------------
__declspec(naked) 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;
}
}
__declspec(naked) void nseel_asm_beloweq_end(void) {}
__declspec(naked) 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_16;
fld1;
jmp label_17;
label_16:
fldz;
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;
}
}
__declspec(naked) void nseel_asm_booltofp_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
fcomp EEL_ASM_TYPE [r12+-8]; //[g_closefact]
#else
fcomp EEL_ASM_TYPE [ebx+-8]; //[g_closefact]
#endif
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;
}
}
__declspec(naked) void nseel_asm_fptobool_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
fcomp EEL_ASM_TYPE [r12+-8]; //[g_closefact]
#else
fcomp EEL_ASM_TYPE [ebx+-8]; //[g_closefact]
#endif
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;
}
}
__declspec(naked) void nseel_asm_fptobool_rev_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fcomp EEL_ASM_TYPE [eax];
mov ecx, eax;
fstsw ax;
test eax, 256;
mov eax, ecx;
jz label_18;
mov eax, edi;
label_18:
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_min_end(void) {}
__declspec(naked) 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 EEL_ASM_TYPE [edi];
fcomp EEL_ASM_TYPE [eax];
mov ecx, eax;
fstsw ax;
test eax, 256;
mov eax, ecx;
jnz label_19;
mov eax, edi;
label_19:
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
}
__declspec(naked) void nseel_asm_max_end(void) {}
__declspec(naked) 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_20;
fxch;
label_20:
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;
}
}
__declspec(naked) void nseel_asm_min_fp_end(void) {}
__declspec(naked) 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_21;
fxch;
label_21:
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;
}
}
__declspec(naked) void nseel_asm_max_fp_end(void) {}
// just generic functions left, yay
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov r15, rsi;
mov rdx, rdi; // third parameter = parm
mov rdi, 0xfefefefe; // first parameter= context
mov rsi, ecx; // second parameter = parm
mov rcx, rax; // fourth parameter = parm
mov rax, 0xfefefefe; // call function
call rax;
mov rsi, r15;
#else
mov edx, ecx; // second parameter = parm
mov ecx, 0xfefefefe; // first parameter= context
mov r8, rdi; // third parameter = parm
mov r9, rax; // fourth parameter = parm
mov edi, 0xfefefefe; // call function
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic3parm_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov r15, rsi;
mov rdx, rdi; // third parameter = parm
mov rdi, 0xfefefefe; // first parameter= context
mov rsi, ecx; // second parameter = parm
mov rcx, rax; // fourth parameter = parm
mov rax, 0xfefefefe; // call function
call rax;
mov rsi, r15;
movq [r15], xmm0;
fld qword ptr [r15];
#else
mov edx, ecx; // second parameter = parm
mov ecx, 0xfefefefe; // first parameter= context
mov r8, rdi; // third parameter = parm
mov r9, rax; // fourth parameter = parm
mov edi, 0xfefefefe; // call function
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
movq [rsi], xmm0;
fld qword ptr [rsi];
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic3parm_retd_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov r15, rsi;
mov esi, edi; // second parameter = parm
mov edi, 0xfefefefe; // first parameter= context
mov rdx, rax; // third parameter = parm
mov rcx, 0xfefefefe; // call function
call rcx;
mov rsi, r15;
#else
mov ecx, 0xfefefefe; // first parameter= context
mov edx, edi; // second parameter = parm
mov r8, rax; // third parameter = parm
mov edi, 0xfefefefe; // call function
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic2parm_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov r15, rsi;
mov rsi, rdi; // second parameter = parm
mov rdi, 0xfefefefe; // first parameter= context
mov rcx, 0xfefefefe; // call function
mov rdx, rax; // third parameter = parm
call rcx;
mov rsi, r15;
movq [r15], xmm0;
fld qword ptr [r15];
#else
mov rdx, rdi; // second parameter = parm
mov rcx, 0xfefefefe; // first parameter= context
mov rdi, 0xfefefefe; // call function
mov r8, rax; // third parameter = parm
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
movq [rsi], xmm0;
fld qword ptr [rsi];
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic2parm_retd_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov rdi, 0xfefefefe; // first parameter= context
mov r15, rsi;
mov rsi, eax; // second parameter = parm
mov rcx, 0xfefefefe; // call function
call rcx;
mov rsi, r15;
#else
mov ecx, 0xfefefefe; // first parameter= context
mov edx, eax; // second parameter = parm
mov edi, 0xfefefefe; // call function
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic1parm_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov rdi, 0xfefefefe; // first parameter = context pointer
mov rcx, 0xfefefefe; // function address
mov r15, rsi; // save rsi
mov rsi, rax; // second parameter = parameter
call rcx;
mov rsi, r15;
movq [r15], xmm0;
fld qword ptr [r15];
#else
mov ecx, 0xfefefefe; // first parameter= context
mov edi, 0xfefefefe; // call function
mov rdx, rax; // second parameter = parm
sub rsp, X64_EXTRA_STACK_SPACE;
call edi;
add rsp, X64_EXTRA_STACK_SPACE;
movq [rsi], xmm0;
fld qword ptr [rsi];
#endif
#else
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;
#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;
}
}
__declspec(naked) void _asm_generic1parm_retd_end(void) {}
// this gets its own stub because it's pretty crucial for performance :/
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
fadd EEL_ASM_TYPE [r12+-8];
fistp dword ptr [rsi];
// check if (%rsi) is in range, and buffer available, otherwise call function
mov edx, dword ptr [rsi];
cmp rdx, ((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK)); //REPLACE=((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK))
jae label_22;
mov rax, rdx;
shr rax, (NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 3/*log2(sizeof(void *))*/ ); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 3/*log2(sizeof(void *))*/ )
and rax, ((NSEEL_RAM_BLOCKS-1)*8 /*sizeof(void*)*/ ); //REPLACE=((NSEEL_RAM_BLOCKS-1)*8 /*sizeof(void*)*/ )
mov rax, qword ptr [r12+rax];
test rax, rax;
jnz label_23;
label_22:
mov rax, 0xfefefefe;
mov rdi, r12; // set first parm to ctx
mov r15, rsi; // save rsi
mov esi, rdx; // esi becomes second parameter (edi is first, context pointer)
call rax;
mov rsi, r15; // restore rsi
jmp label_24;
label_23:
and rdx, (NSEEL_RAM_ITEMSPERBLOCK-1); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK-1)
shl rdx, 3; // 3 is log2(sizeof(EEL_F))
add rax, rdx;
label_24:
#else
fadd EEL_ASM_TYPE [r12+-8];
fistp dword ptr [rsi];
// check if (%rsi) is in range...
mov edi, dword ptr [rsi];
cmp edi, ((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK)); //REPLACE=((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK))
jae label_25;
mov rax, rdi;
shr rax, (NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 3/*log2(sizeof(void *))*/ ); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 3/*log2(sizeof(void *))*/ )
and rax, ((NSEEL_RAM_BLOCKS-1)*8 /*sizeof(void*)*/ ); //REPLACE=((NSEEL_RAM_BLOCKS-1)*8 /*sizeof(void*)*/ )
mov rax, qword ptr [r12+rax];
test rax, rax;
jnz label_26;
label_25:
mov rax, 0xfefefefe; // function ptr
mov rcx, r12; // set first parm to ctx
mov rdx, rdi; // rdx is second parameter (rcx is first)
sub rsp, X64_EXTRA_STACK_SPACE;
call rax;
add rsp, X64_EXTRA_STACK_SPACE;
jmp label_27;
label_26:
and rdi, (NSEEL_RAM_ITEMSPERBLOCK-1); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK-1)
shl rdi, 3; // 3 is log2(sizeof(EEL_F))
add rax, rdi;
label_27:
#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;
#else
fadd EEL_ASM_TYPE [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_28;
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_29;
label_28:
sub esp, 8; // keep stack aligned
mov ecx, 0xfefefefe;
push edi; // parameter
push ebx; // push context pointer
call ecx;
add esp, 16;
jmp label_30;
label_29:
and edi, (NSEEL_RAM_ITEMSPERBLOCK-1); //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK-1)
shl edi, 3; // 3 is log2(sizeof(EEL_F))
add eax, edi;
label_30:
_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
#endif
}
}
__declspec(naked) void _asm_megabuf_end(void) {}
__declspec(naked) 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;
#ifdef TARGET_X64
#ifdef AMD64ABI
mov r15, rsi;
fadd EEL_ASM_TYPE [r12+-8];
mov rdi, 0xfefefefe; // first parameter = context pointer
fistp dword ptr [rsi];
mov edx, 0xfefefefe;
mov esi, dword ptr [rsi];
call rdx;
mov rsi, r15;
#else
fadd EEL_ASM_TYPE [r12+-8];
mov rcx, 0xfefefefe; // first parameter = context pointer
fistp dword ptr [rsi];
mov rdi, 0xfefefefe;
mov edx, dword ptr [rsi];
sub rsp, X64_EXTRA_STACK_SPACE;
call rdi;
add rsp, X64_EXTRA_STACK_SPACE;
#endif
#else
sub esp, 16; // keep stack aligned
mov dword ptr [esp], 0xfefefefe;
fadd EEL_ASM_TYPE [ebx+-8];
mov edi, 0xfefefefe;
fistp dword ptr [esp+4];
call edi;
add esp, 16;
#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;
}
}
__declspec(naked) void _asm_gmegabuf_end(void) {}
__declspec(naked) void nseel_asm_stack_push(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rcx, qword ptr [rax];
mov rax, qword ptr [rdi];
add rax, 8;
mov rdx, 0xFEFEFEFE;
and rax, rdx;
mov rdx, 0xFEFEFEFE;
or rax, rdx;
mov qword ptr [rax], rcx;
mov qword ptr [rdi], rax;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_push_end(void) {}
__declspec(naked) void nseel_asm_stack_pop(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rcx, qword ptr [rdi];
movq xmm0, [rcx];
sub rcx, 8;
mov rdx, 0xFEFEFEFE;
and rcx, rdx;
mov rdx, 0xFEFEFEFE;
or rcx, rdx;
mov qword ptr [rdi], rcx;
movq [eax], xmm0;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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 EEL_ASM_TYPE [ecx];
sub ecx, 8;
and ecx, 0xfefefefe;
or ecx, 0xfefefefe;
mov dword ptr [edi], ecx;
fstp EEL_ASM_TYPE [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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_pop_end(void) {}
__declspec(naked) void nseel_asm_stack_pop_fast(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rcx, qword ptr [rdi];
mov rax, rcx;
sub rcx, 8;
mov rdx, 0xFEFEFEFE;
and rcx, rdx;
mov rdx, 0xFEFEFEFE;
or rcx, rdx;
mov qword ptr [rdi], rcx;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_pop_fast_end(void) {}
__declspec(naked) void nseel_asm_stack_peek_int(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rax, qword ptr [rdi];
mov rdx, 0xfefefefe;
sub rax, rdx;
mov rdx, 0xFEFEFEFE;
and rax, rdx;
mov rdx, 0xFEFEFEFE;
or rax, rdx;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_peek_int_end(void) {}
__declspec(naked) void nseel_asm_stack_peek(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
fistp dword ptr [rsi];
mov rax, qword ptr [rdi];
mov rdx, qword ptr [rsi];
shl rdx, 3; // log2(sizeof(EEL_F))
sub rax, rdx;
mov rdx, 0xFEFEFEFE;
and rax, rdx;
mov rdx, 0xFEFEFEFE;
or rax, rdx;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_peek_end(void) {}
__declspec(naked) void nseel_asm_stack_peek_top(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rax, qword ptr [rdi];
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_peek_top_end(void) {}
__declspec(naked) void nseel_asm_stack_exch(void)
{
#ifdef TARGET_X64
__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 rdi, 0xfefefefe;
mov rcx, qword ptr [rdi];
movq xmm0, [rcx];
movq xmm1, [rax];
movq [rax], xmm0;
movq [rcx], xmm1;
_emit 0x89;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
_emit 0x90;
}
#else
__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 EEL_ASM_TYPE [ecx];
fld EEL_ASM_TYPE [eax];
fstp EEL_ASM_TYPE [ecx];
fstp EEL_ASM_TYPE [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;
}
#endif
}
__declspec(naked) void nseel_asm_stack_exch_end(void) {}
#ifdef TARGET_X64
__declspec(naked) void eel_callcode64()
{
__asm {
#ifndef EEL_X64_NO_CHANGE_FPFLAGS
sub rsp, 16;
fnstcw [rsp];
mov ax, [rsp];
or ax, 0xE3F; // 53 or 64 bit precision, trunc, and masking all exceptions
mov [rsp+4], ax;
fldcw [rsp+4];
#endif
push rbx;
push rbp;
push r12;
push r13;
push r14;
push r15;
#ifdef AMD64ABI
mov r12, rsi; // second parameter is ram-blocks pointer
call rdi;
#else
push rdi;
push rsi;
mov r12, rdx; // second parameter is ram-blocks pointer
call rcx;
pop rsi;
pop rdi;
#endif
fclex;
pop r15;
pop r14;
pop r13;
pop r12;
pop rbp;
pop rbx;
#ifndef EEL_X64_NO_CHANGE_FPFLAGS
fldcw [rsp];
add rsp, 16;
#endif
ret;
}
}
__declspec(naked) void eel_callcode64_fast()
{
__asm {
push rbx;
push rbp;
push r12;
push r13;
push r14;
push r15;
#ifdef AMD64ABI
mov r12, rsi; // second parameter is ram-blocks pointer
call rdi;
#else
push rdi;
push rsi;
mov r12, rdx; // second parameter is ram-blocks pointer
call rcx;
pop rsi;
pop rdi;
#endif
pop r15;
pop r14;
pop r13;
pop r12;
pop rbp;
pop rbx;
ret;
}
}
__declspec(naked) void eel_setfp_round()
{
__asm {
#ifndef EEL_X64_NO_CHANGE_FPFLAGS
sub rsp, 16;
fnstcw [rsp];
mov ax, [rsp];
and ax, 0xF3FF; // set round to nearest
mov [rsp+4], ax;
fldcw [rsp+4];
add rsp, 16;
#endif
ret;
}
}
__declspec(naked) void eel_setfp_trunc()
{
__asm {
#ifndef EEL_X64_NO_CHANGE_FPFLAGS
sub rsp, 16;
fnstcw [rsp];
mov ax, [rsp];
or ax, 0xC00; // set to truncate
mov [rsp+4], ax;
fldcw [rsp+4];
add rsp, 16;
#endif
ret;
}
}
__declspec(naked) void eel_enterfp(int s[2])
{
__asm {
#ifdef AMD64ABI
fnstcw [rdi];
mov ax, [rdi];
or ax, 0xE3F; // 53 or 64 bit precision, trunc, and masking all exceptions
mov [rdi+4], ax;
fldcw [rdi+4];
#else
fnstcw [rcx];
mov ax, [rcx];
or ax, 0xE3F; // 53 or 64 bit precision, trunc, and masking all exceptions
mov [rcx+4], ax;
fldcw [rcx+4];
#endif
ret;
}
}
__declspec(naked) void eel_leavefp(int s[2])
{
__asm {
#ifdef AMD64ABI
fldcw [rdi];
#else
fldcw [rcx];
#endif
ret;;
}
}
#endif