Commit 9c6e12ac29

Andrew Kelley <superjoe30@gmail.com>
2017-09-30 19:58:05
compiler-rt: add _aulldiv and _aullrem for i386 windows
1 parent b7a4f16
Changed files (4)
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);
+}
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);
+}
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");
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")