forked from OSchip/llvm-project
ARM: set default float ABI based on triple.
Clang sets the float-abi target option manually, but no longer annotates each function with its ABI. This can lead to confusing mistmatch between "clang -emit-llvm | llc" and normal clang invocations. Besides which, gnueabihf actually *is* hard-float. Defaulting to soft was just perverse. llvm-svn: 197554
This commit is contained in:
parent
cb164ab273
commit
44594ad7e2
|
@ -321,6 +321,11 @@ public:
|
|||
TargetTriple.getEnvironment() == Triple::EABIHF;
|
||||
}
|
||||
|
||||
bool isTargetHardFloat() const {
|
||||
return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
|
||||
TargetTriple.getEnvironment() == Triple::EABIHF;
|
||||
}
|
||||
|
||||
bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; }
|
||||
bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; }
|
||||
|
||||
|
|
|
@ -53,7 +53,8 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT,
|
|||
InstrItins(Subtarget.getInstrItineraryData()) {
|
||||
// Default to soft float ABI
|
||||
if (Options.FloatABIType == FloatABI::Default)
|
||||
this->Options.FloatABIType = FloatABI::Soft;
|
||||
this->Options.FloatABIType =
|
||||
Subtarget.isTargetHardFloat() ? FloatABI::Hard : FloatABI::Soft;
|
||||
}
|
||||
|
||||
void ARMBaseTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
; RUN: llc -mtriple=armv7-linux-gnueabihf %s -o - | FileCheck %s --check-prefix=CHECK-HARD
|
||||
; RUN: llc -mtriple=armv7-linux-eabihf %s -o - | FileCheck %s --check-prefix=CHECK-HARD
|
||||
; RUN: llc -mtriple=armv7-linux-gnueabihf -float-abi=soft %s -o - | FileCheck %s --check-prefix=CHECK-SOFT
|
||||
; RUN: llc -mtriple=armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=CHECK-SOFT
|
||||
; RUN: llc -mtriple=armv7-linux-eabi -float-abi=hard %s -o - | FileCheck %s --check-prefix=CHECK-HARD
|
||||
; RUN: llc -mtriple=thumbv7-apple-ios6.0 %s -o - | FileCheck %s --check-prefix=CHECK-SOFT
|
||||
|
||||
define float @test_abi(float %lhs, float %rhs) {
|
||||
%sum = fadd float %lhs, %rhs
|
||||
ret float %sum
|
||||
|
||||
; CHECK-HARD-LABEL: test_abi:
|
||||
; CHECK-HARD-NOT: vmov
|
||||
; CHECK-HARD: vadd.f32 s0, s0, s1
|
||||
; CHECK-HARD-NOT: vmov
|
||||
|
||||
; CHECK-SOFT-LABEL: test_abi:
|
||||
; CHECK-SOFT-DAG: vmov [[LHS:s[0-9]+]], r0
|
||||
; CHECK-SOFT-DAG: vmov [[RHS:s[0-9]+]], r1
|
||||
; CHECK-SOFT: vadd.f32 [[DEST:s[0-9]+]], [[LHS]], [[RHS]]
|
||||
; CHECK-SOFT: vmov r0, [[DEST]]
|
||||
}
|
Loading…
Reference in New Issue