From 9c6e12ac2950264bc129fdd04d596ddbe22d8dc9 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 30 Sep 2017 13:58:05 -0400 Subject: [PATCH] compiler-rt: add _aulldiv and _aullrem for i386 windows --- CMakeLists.txt | 2 + std/special/compiler_rt/aulldiv.zig | 65 ++++++++++++++++++++++++++++ std/special/compiler_rt/aullrem.zig | 66 +++++++++++++++++++++++++++++ std/special/compiler_rt/index.zig | 2 + 4 files changed, 135 insertions(+) create mode 100644 std/special/compiler_rt/aulldiv.zig create mode 100644 std/special/compiler_rt/aullrem.zig diff --git a/CMakeLists.txt b/CMakeLists.txt index 214dc340f..254557638 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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") diff --git a/std/special/compiler_rt/aulldiv.zig b/std/special/compiler_rt/aulldiv.zig new file mode 100644 index 000000000..2b3487dec --- /dev/null +++ b/std/special/compiler_rt/aulldiv.zig @@ -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); +} diff --git a/std/special/compiler_rt/aullrem.zig b/std/special/compiler_rt/aullrem.zig new file mode 100644 index 000000000..7945857fe --- /dev/null +++ b/std/special/compiler_rt/aullrem.zig @@ -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); +} diff --git a/std/special/compiler_rt/index.zig b/std/special/compiler_rt/index.zig index 29fffca80..a19eac4c2 100644 --- a/std/special/compiler_rt/index.zig +++ b/std/special/compiler_rt/index.zig @@ -13,6 +13,8 @@ comptime { _ = @import("udivmodti4.zig"); _ = @import("udivti3.zig"); _ = @import("umodti3.zig"); + _ = @import("aulldiv.zig"); + _ = @import("aullrem.zig"); } const builtin = @import("builtin");