OSDN Git Service

CodeGen: use MSVC division on windows itanium
authorSaleem Abdulrasool <compnerd@compnerd.org>
Thu, 13 Oct 2016 23:00:11 +0000 (23:00 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Thu, 13 Oct 2016 23:00:11 +0000 (23:00 +0000)
Windows itanium is identical to MSVC when dealing with everything but C++.
Lower the math routines into msvcrt rather than compiler-rt.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284175 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/divide-windows-itanium.ll [new file with mode: 0644]

index b4cb043..d02dc76 100644 (file)
@@ -114,7 +114,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
       addBypassSlowDiv(64, 16);
   }
 
-  if (Subtarget.isTargetKnownWindowsMSVC()) {
+  if (Subtarget.isTargetKnownWindowsMSVC() ||
+      Subtarget.isTargetWindowsItanium()) {
     // Setup Windows compiler runtime calls.
     setLibcallName(RTLIB::SDIV_I64, "_alldiv");
     setLibcallName(RTLIB::UDIV_I64, "_aulldiv");
diff --git a/test/CodeGen/X86/divide-windows-itanium.ll b/test/CodeGen/X86/divide-windows-itanium.ll
new file mode 100644 (file)
index 0000000..4a8a913
--- /dev/null
@@ -0,0 +1,38 @@
+; RUN: llc -mtriple i686-windows-itanium -filetype asm -o - %s | FileCheck %s
+
+define i64 @f(i64 %i, i64 %j) {
+  %1 = sdiv i64 %i, %j
+  ret i64 %1
+}
+
+; CHECK-LABEL: _f:
+; CHECK-NOT: calll ___divdi3
+; CHECK: calll __alldiv
+
+define i64 @g(i64 %i, i64 %j) {
+  %1 = udiv i64 %i, %j
+  ret i64 %1
+}
+
+; CHECK-LABEL: _g:
+; CHECK-NOT: calll ___udivdi3
+; CHECK: calll __aulldiv
+
+define i64 @h(i64 %i, i64 %j) {
+  %1 = srem i64 %i, %j
+  ret i64 %1
+}
+
+; CHECK-LABEL: _h:
+; CHECK-NOT: calll ___moddi3
+; CHECK: calll __allrem
+
+define i64 @i(i64 %i, i64 %j) {
+  %1 = urem i64 %i, %j
+  ret i64 %1
+}
+
+; CHECK-LABEL: _i:
+; CHECK-NOT: calll ___umoddi3
+; CHECK: calll __aullrem
+