compiler-rt: add _aulldiv and _aullrem for i386 windows

master
Andrew Kelley 2017-09-30 13:58:05 -04:00
parent b7a4f16cc4
commit 9c6e12ac29
4 changed files with 135 additions and 0 deletions

View File

@ -563,6 +563,8 @@ install(FILES "${CMAKE_SOURCE_DIR}/std/special/bootstrap.zig" DESTINATION "${ZIG
install(FILES "${CMAKE_SOURCE_DIR}/std/special/build_file_template.zig" DESTINATION "${ZIG_STD_DEST}/special")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/build_runner.zig" DESTINATION "${ZIG_STD_DEST}/special")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/builtin.zig" DESTINATION "${ZIG_STD_DEST}/special")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/compiler_rt/aulldiv.zig" DESTINATION "${ZIG_STD_DEST}/special/compiler_rt")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/compiler_rt/aullrem.zig" DESTINATION "${ZIG_STD_DEST}/special/compiler_rt")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/compiler_rt/comparetf2.zig" DESTINATION "${ZIG_STD_DEST}/special/compiler_rt")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/compiler_rt/fixuint.zig" DESTINATION "${ZIG_STD_DEST}/special/compiler_rt")
install(FILES "${CMAKE_SOURCE_DIR}/std/special/compiler_rt/fixunsdfdi.zig" DESTINATION "${ZIG_STD_DEST}/special/compiler_rt")

View File

@ -0,0 +1,65 @@
const builtin = @import("builtin");
export nakedcc fn _aulldiv() {
@setDebugSafety(this, false);
if (comptime builtin.os == builtin.Os.windows) {
if (comptime builtin.arch == builtin.Arch.i386) {
asm volatile (
\\.intel_syntax noprefix
\\
\\ push ebx
\\ push esi
\\ mov eax,dword ptr [esp+18h]
\\ or eax,eax
\\ jne L1
\\ mov ecx,dword ptr [esp+14h]
\\ mov eax,dword ptr [esp+10h]
\\ xor edx,edx
\\ div ecx
\\ mov ebx,eax
\\ mov eax,dword ptr [esp+0Ch]
\\ div ecx
\\ mov edx,ebx
\\ jmp L2
\\ L1:
\\ mov ecx,eax
\\ mov ebx,dword ptr [esp+14h]
\\ mov edx,dword ptr [esp+10h]
\\ mov eax,dword ptr [esp+0Ch]
\\ L3:
\\ shr ecx,1
\\ rcr ebx,1
\\ shr edx,1
\\ rcr eax,1
\\ or ecx,ecx
\\ jne L3
\\ div ebx
\\ mov esi,eax
\\ mul dword ptr [esp+18h]
\\ mov ecx,eax
\\ mov eax,dword ptr [esp+14h]
\\ mul esi
\\ add edx,ecx
\\ jb L4
\\ cmp edx,dword ptr [esp+10h]
\\ ja L4
\\ jb L5
\\ cmp eax,dword ptr [esp+0Ch]
\\ jbe L5
\\ L4:
\\ dec esi
\\ L5:
\\ xor edx,edx
\\ mov eax,esi
\\ L2:
\\ pop esi
\\ pop ebx
\\ ret 10h
);
unreachable;
}
}
@setGlobalLinkage(_aulldiv, builtin.GlobalLinkage.Internal);
}

View File

@ -0,0 +1,66 @@
const builtin = @import("builtin");
export nakedcc fn _aullrem() {
@setDebugSafety(this, false);
if (comptime builtin.os == builtin.Os.windows) {
if (comptime builtin.arch == builtin.Arch.i386) {
asm volatile (
\\.intel_syntax noprefix
\\
\\ push ebx
\\ mov eax,dword ptr [esp+14h]
\\ or eax,eax
\\ jne L1a
\\ mov ecx,dword ptr [esp+10h]
\\ mov eax,dword ptr [esp+0Ch]
\\ xor edx,edx
\\ div ecx
\\ mov eax,dword ptr [esp+8]
\\ div ecx
\\ mov eax,edx
\\ xor edx,edx
\\ jmp L2a
\\ L1a:
\\ mov ecx,eax
\\ mov ebx,dword ptr [esp+10h]
\\ mov edx,dword ptr [esp+0Ch]
\\ mov eax,dword ptr [esp+8]
\\ L3a:
\\ shr ecx,1
\\ rcr ebx,1
\\ shr edx,1
\\ rcr eax,1
\\ or ecx,ecx
\\ jne L3a
\\ div ebx
\\ mov ecx,eax
\\ mul dword ptr [esp+14h]
\\ xchg eax,ecx
\\ mul dword ptr [esp+10h]
\\ add edx,ecx
\\ jb L4a
\\ cmp edx,dword ptr [esp+0Ch]
\\ ja L4a
\\ jb L5a
\\ cmp eax,dword ptr [esp+8]
\\ jbe L5a
\\ L4a:
\\ sub eax,dword ptr [esp+10h]
\\ sbb edx,dword ptr [esp+14h]
\\ L5a:
\\ sub eax,dword ptr [esp+8]
\\ sbb edx,dword ptr [esp+0Ch]
\\ neg edx
\\ neg eax
\\ sbb edx,0
\\ L2a:
\\ pop ebx
\\ ret 10h
);
unreachable;
}
}
@setGlobalLinkage(_aullrem, builtin.GlobalLinkage.Internal);
}

View File

@ -13,6 +13,8 @@ comptime {
_ = @import("udivmodti4.zig");
_ = @import("udivti3.zig");
_ = @import("umodti3.zig");
_ = @import("aulldiv.zig");
_ = @import("aullrem.zig");
}
const builtin = @import("builtin");