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