From: Tim Northover Date: Mon, 8 May 2017 20:00:14 +0000 (+0000) Subject: ARM: use divmod libcalls on embedded MachO platforms too. X-Git-Tag: android-x86-7.1-r4~16560 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a641bd93fbf83cdf0deb8c0cbcc36ff980b5a0f5;p=android-x86%2Fexternal-llvm.git ARM: use divmod libcalls on embedded MachO platforms too. The separated libcalls are implemented in terms of __divmodsi4 and __udivmodsi4 anyway, so we should always use them if possible. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302462 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index e64582402fe..e5c4d86ed92 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -473,9 +473,9 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, } // Use divmod compiler-rt calls for iOS 5.0 and later. - if (Subtarget->isTargetWatchOS() || - (Subtarget->isTargetIOS() && - !Subtarget->getTargetTriple().isOSVersionLT(5, 0))) { + if (Subtarget->isTargetMachO() && + !(Subtarget->isTargetIOS() && + Subtarget->getTargetTriple().isOSVersionLT(5, 0))) { setLibcallName(RTLIB::SDIVREM_I32, "__divmodsi4"); setLibcallName(RTLIB::UDIVREM_I32, "__udivmodsi4"); } diff --git a/test/CodeGen/ARM/divmod-eabi.ll b/test/CodeGen/ARM/divmod-eabi.ll index ce5a1df05e3..77ffc46e6a6 100644 --- a/test/CodeGen/ARM/divmod-eabi.ll +++ b/test/CodeGen/ARM/divmod-eabi.ll @@ -16,17 +16,15 @@ ; RUN: llc -mtriple armv7-linux-gnueabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI ; RUN: llc -mtriple armv7-linux-musleabi %s -o - | FileCheck %s --check-prefix=EABI ; RUN: llc -mtriple armv7-linux-musleabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI -; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefixes=DARWIN,DARWIN-DEFAULT -; RUN: llc -mtriple armv7-apple-darwin %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefixes=DARWIN,DARWIN-O0 -; FIXME: long-term, we will use "-apple-macho" and won't need this exception: -; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefixes=DARWIN,DARWIN-DEFAULT -; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefixes=DARWIN,DARWIN-O0 +; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefixes=DARWIN +; RUN: llc -mtriple armv7-apple-darwin %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=DARWIN-O0 ; RUN: llc -mtriple thumbv7-windows %s -o - | FileCheck %s --check-prefixes=WINDOWS,WINDOWS-DEFAULT ; RUN: llc -mtriple thumbv7-windows %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefixes=WINDOWS,WINDOWS-O0 define signext i16 @f16(i16 signext %a, i16 signext %b) { ; EABI-LABEL: f16: ; DARWIN-LABEL: f16: +; DARWIN-O0-LABEL: f16: ; WINDOWS-LABEL: f16: entry: %conv = sext i16 %a to i32 @@ -36,11 +34,9 @@ entry: ; EABI: __aeabi_idivmod ; EABI: mov [[div:r[0-9]+]], r0 ; EABI: mov [[rem:r[0-9]+]], r1 -; DARWIN: ___divsi3 -; DARWIN: mov [[div:r[0-9]+]], r0 -; DARWIN: __modsi3 -; DARWIN-DEFAULT: add [[sum:r[0-9]+]], r0, [[div]] -; DARWIN-O0: mov [[rem:r[0-9]+]], r0 +; DARWIN: __divmodsi4 +; DARWIN-O0: __divsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv ; WINDOWS: __rt_sdiv ; WINDOWS-DEFAULT: add [[sum:r[0-9]+]], r1 @@ -48,16 +44,13 @@ entry: %rem8 = srem i32 %conv1, %conv ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv %add = add nsw i32 %rem, %div %add13 = add nsw i32 %add, %rem8 %conv14 = trunc i32 %add13 to i16 ; EABI: add r0{{.*}}r1 ; EABI: sxth r0, r0 -; DARWIN-DEFAULT: add [[res:r[0-9]+]], [[sum]], r0 -; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] -; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 -; DARWIN: sxth r0, [[res]] ; WINDOWS-DEFAULT: adds [[sum1:r[0-9]+]], [[sum]], r1 ; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], ; WINDOWS-O0: add [[sum1:r[0-9]+]], r1 @@ -68,6 +61,7 @@ entry: define i32 @f32(i32 %a, i32 %b) { ; EABI-LABEL: f32: ; DARWIN-LABEL: f32: +; DARWIN-O0-LABEL: f32: ; WINDOWS-LABEL: f32: entry: %div = sdiv i32 %a, %b @@ -75,11 +69,9 @@ entry: ; EABI: __aeabi_idivmod ; EABI: mov [[div:r[0-9]+]], r0 ; EABI: mov [[rem:r[0-9]+]], r1 -; DARWIN: ___divsi3 -; DARWIN: mov [[div:r[0-9]+]], r0 -; DARWIN: __modsi3 -; DARWIN-DEFAULT: add [[sum:r[0-9]+]], r0, [[div]] -; DARWIN-O0: mov [[rem:r[0-9]+]], r0 +; DARWIN: ___divmodsi4 +; DARWIN-O0: __divsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv @@ -87,13 +79,11 @@ entry: %rem1 = srem i32 %b, %a ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv %add = add nsw i32 %rem, %div %add2 = add nsw i32 %add, %rem1 ; EABI: add r0{{.*}}r1 -; DARWIN-DEFAULT: add r0, [[sum]], r0 -; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] -; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 ; WINDOWS-DEFAULT: adds r0, [[div]], r1 ; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], [[div]] ; WINDOWS-O0: add [[sum]], r1 @@ -103,16 +93,15 @@ entry: define i32 @uf(i32 %a, i32 %b) { ; EABI-LABEL: uf: ; DARWIN-LABEL: uf: +; DARWIN-O0-LABEL: uf: ; WINDOWS-LABEL: uf: entry: %div = udiv i32 %a, %b %rem = urem i32 %a, %b ; EABI: __aeabi_uidivmod -; DARWIN: ___udivsi3 -; DARWIN: mov [[div:r[0-9]+]], r0 -; DARWIN: __umodsi3 -; DARWIN-DEFAULT: add [[sum:r[0-9]+]], r0, [[div]] -; DARWIN-O0: mov [[rem:r[0-9]+]], r0 +; DARWIN: __udivmodsi4 +; DARWIN-O0: __udivsi3 +; DARWIN-O0: __umodsi3 ; WINDOWS: __rt_udiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_udiv @@ -120,13 +109,11 @@ entry: %rem1 = urem i32 %b, %a ; EABI: __aeabi_uidivmod ; DARWIN: __umodsi3 +; DARWIN-O0: __umodsi3 ; WINDOWS: __rt_udiv %add = add nuw i32 %rem, %div %add2 = add nuw i32 %add, %rem1 ; EABI: add r0{{.*}}r1 -; DARWIN-DEFAULT: add r0, [[sum]], r0 -; DARWIN-O0: add [[sum:r[0-9]+]], [[rem]], [[div]] -; DARWIN-O0: add [[res:r[0-9]+]], [[sum]], r0 ; WINDOWS-DEFAULT: adds [[sum:r[0-9]+]], [[div]], r1 ; WINDOWS-O0: adds [[sum:r[0-9]+]], ; WINDOWS-O0: add [[sum]], r1 @@ -136,6 +123,7 @@ entry: define i64 @longf(i64 %a, i64 %b) { ; EABI-LABEL: longf: ; DARWIN-LABEL: longf: +; DARWIN-O0-LABEL: longf: ; WINDOWS-LABEL: longf: entry: %div = sdiv i64 %a, %b @@ -148,6 +136,8 @@ entry: ; DARWIN: mov [[div1:r[0-9]+]], r0 ; DARWIN: mov [[div2:r[0-9]+]], r1 ; DARWIN: __moddi3 +; DARWIN-O0: __divdi3 +; DARWIN-O0: __moddi3 ; WINDOWS: __rt_sdiv64 %add = add nsw i64 %rem, %div ; DARWIN: adds r0{{.*}}[[div1]] @@ -160,20 +150,19 @@ entry: define i16 @shortf(i16 %a, i16 %b) { ; EABI-LABEL: shortf: ; DARWIN-LABEL: shortf: +; DARWIN-O0-LABEL: shortf: ; WINDOWS-LABEL: shortf: entry: %div = sdiv i16 %a, %b %rem = srem i16 %a, %b ; EABI: __aeabi_idivmod -; DARWIN: ___divsi3 -; DARWIN: mov [[div1:r[0-9]+]], r0 -; DARWIN: __modsi3 +; DARWIN: ___divmodsi4 +; DARWIN-O0: __divmodsi4 ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv %add = add nsw i16 %rem, %div ; EABI: add r0, r1 -; DARWIN: add r0{{.*}}[[div1]] ; WINDOWS: adds r0, r1, [[div]] ret i16 %add } @@ -181,20 +170,20 @@ entry: define i32 @g1(i32 %a, i32 %b) { ; EABI-LABEL: g1: ; DARWIN-LABEL: g1: +; DARWIN-O0-LABEL: g1: ; WINDOWS-LABEL: g1: entry: %div = sdiv i32 %a, %b %rem = srem i32 %a, %b ; EABI: __aeabi_idivmod -; DARWIN: ___divsi3 -; DARWIN: mov [[sum:r[0-9]+]], r0 -; DARWIN: __modsi3 +; DARWIN: ___divmodsi4 +; DARWIN-O0: __divsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 ; WINDOWS: __rt_sdiv %add = add nsw i32 %rem, %div ; EABI: add r0{{.*}}r1 -; DARWIN: add r0{{.*}}[[sum]] ; WINDOWS: adds r0, r1, [[div]] ret i32 %add } @@ -203,11 +192,13 @@ entry: define i32 @g2(i32 %a, i32 %b) { ; EABI-LABEL: g2: ; DARWIN-LABEL: g2: +; DARWIN-O0-LABEL: g2: ; WINDOWS-LABEL: g2: entry: %rem = srem i32 %a, %b ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv ret i32 %rem ; EABI: mov r0, r1 @@ -217,6 +208,7 @@ entry: define i32 @g3(i32 %a, i32 %b) { ; EABI-LABEL: g3: ; DARWIN-LABEL: g3: +; DARWIN-O0-LABEL: g3: ; WINDOWS-LABEL: g3: entry: %rem = srem i32 %a, %b @@ -224,11 +216,13 @@ entry: ; EABI: mov [[mod:r[0-9]+]], r1 ; DARWIN: __modsi3 ; DARWIN: mov [[sum:r[0-9]+]], r0 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[rem:r[0-9]+]], r1 %rem1 = srem i32 %b, %rem ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv %add = add nsw i32 %rem1, %rem ; EABI: add r0, r1, [[mod]] @@ -240,6 +234,7 @@ entry: define i32 @g4(i32 %a, i32 %b) { ; EABI-LABEL: g4: ; DARWIN-LABEL: g4: +; DARWIN-O0-LABEL: g4: ; WINDOWS-LABEL: g4: entry: %div = sdiv i32 %a, %b @@ -247,11 +242,13 @@ entry: ; EABI: mov [[div:r[0-9]+]], r0 ; DARWIN: ___divsi3 ; DARWIN: mov [[sum:r[0-9]+]], r0 +; DARWIN-O0: __divsi3 ; WINDOWS: __rt_sdiv ; WINDOWS: mov [[div:r[0-9]+]], r0 %rem = srem i32 %b, %div ; EABI: __aeabi_idivmod ; DARWIN: __modsi3 +; DARWIN-O0: __modsi3 ; WINDOWS: __rt_sdiv %add = add nsw i32 %rem, %div ; EABI: add r0, r1, [[div]] diff --git a/test/CodeGen/ARM/divmod.ll b/test/CodeGen/ARM/divmod.ll index 9336d0c477d..ffc1ed09cbf 100644 --- a/test/CodeGen/ARM/divmod.ll +++ b/test/CodeGen/ARM/divmod.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=arm-apple-ios5.0 -mcpu=cortex-a8 | FileCheck %s -check-prefix=A8 ; RUN: llc < %s -mtriple=arm-apple-ios5.0 -mcpu=swift | FileCheck %s -check-prefix=SWIFT +; RUN: llc < %s -mtriple=thumbv7-apple-macho -mcpu=cortex-a8 | FileCheck %s -check-prefix=A8 ; rdar://12481395