summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2016-09-06 00:28:43 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2016-09-06 00:28:43 +0000
commita6519b1d543654b9b6a694ed3288e393612d3589 (patch)
tree8c7dfb11c96c9ec3b55b971078b44eca98c25c7d /llvm/test/CodeGen/ARM
parentdfc4fc9f02f5853a8ecd176b18cce21a30a04dc1 (diff)
downloadbcm5719-llvm-a6519b1d543654b9b6a694ed3288e393612d3589.tar.gz
bcm5719-llvm-a6519b1d543654b9b6a694ed3288e393612d3589.zip
CodeGen: ensure that libcalls are always AAPCS CC
All of the builtins are designed to be invoked with ARM AAPCS CC even on ARM AAPCS VFP CC hosts. Tweak the default initialisation to ARM AAPCS CC rather than C CC for ARM/thumb targets. The changes to the tests are necessary to ensure that the calling convention for the lowered library calls are honoured. Furthermore, these adjustments cause certain branch invocations to change to branch-and-link since the returned value needs to be moved across registers (d0 -> r0, r1). llvm-svn: 280683
Diffstat (limited to 'llvm/test/CodeGen/ARM')
-rw-r--r--llvm/test/CodeGen/ARM/arm32-rounding.ll85
-rw-r--r--llvm/test/CodeGen/ARM/tail-call-builtin.ll23
2 files changed, 55 insertions, 53 deletions
diff --git a/llvm/test/CodeGen/ARM/arm32-rounding.ll b/llvm/test/CodeGen/ARM/arm32-rounding.ll
index f247648d814..d1aeb886b43 100644
--- a/llvm/test/CodeGen/ARM/arm32-rounding.ll
+++ b/llvm/test/CodeGen/ARM/arm32-rounding.ll
@@ -4,115 +4,116 @@
; CHECK-LABEL: test1
; CHECK: vrintm.f32
-define float @test1(float %a) {
+define arm_aapcs_vfpcc float @test1(float %a) {
entry:
- %call = call float @floorf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @floorf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test2
-; SP: b floor
+; SP: bl floor
; DP: vrintm.f64
-define double @test2(double %a) {
+define arm_aapcs_vfpcc double @test2(double %a) {
entry:
- %call = call double @floor(double %a) nounwind readnone
+ %call = call arm_aapcscc double @floor(double %a) nounwind readnone
ret double %call
}
; CHECK-LABEL: test3
; CHECK: vrintp.f32
-define float @test3(float %a) {
+define arm_aapcs_vfpcc float @test3(float %a) {
entry:
- %call = call float @ceilf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @ceilf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test4
-; SP: b ceil
+; SP: bl ceil
; DP: vrintp.f64
-define double @test4(double %a) {
+define arm_aapcs_vfpcc double @test4(double %a) {
entry:
- %call = call double @ceil(double %a) nounwind readnone
+ %call = call arm_aapcscc double @ceil(double %a) nounwind readnone
ret double %call
}
; CHECK-LABEL: test5
; CHECK: vrinta.f32
-define float @test5(float %a) {
+define arm_aapcs_vfpcc float @test5(float %a) {
entry:
- %call = call float @roundf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @roundf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test6
-; SP: b round
+; SP: bl round
; DP: vrinta.f64
-define double @test6(double %a) {
+define arm_aapcs_vfpcc double @test6(double %a) {
entry:
- %call = call double @round(double %a) nounwind readnone
+ %call = call arm_aapcscc double @round(double %a) nounwind readnone
ret double %call
}
; CHECK-LABEL: test7
; CHECK: vrintz.f32
-define float @test7(float %a) {
+define arm_aapcs_vfpcc float @test7(float %a) {
entry:
- %call = call float @truncf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @truncf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test8
-; SP: b trunc
+; SP: bl trunc
; DP: vrintz.f64
-define double @test8(double %a) {
+define arm_aapcs_vfpcc double @test8(double %a) {
entry:
- %call = call double @trunc(double %a) nounwind readnone
+ %call = call arm_aapcscc double @trunc(double %a) nounwind readnone
ret double %call
}
; CHECK-LABEL: test9
; CHECK: vrintr.f32
-define float @test9(float %a) {
+define arm_aapcs_vfpcc float @test9(float %a) {
entry:
- %call = call float @nearbyintf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @nearbyintf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test10
-; SP: b nearbyint
+; SP: bl nearbyint
; DP: vrintr.f64
-define double @test10(double %a) {
+define arm_aapcs_vfpcc double @test10(double %a) {
entry:
- %call = call double @nearbyint(double %a) nounwind readnone
+ %call = call arm_aapcscc double @nearbyint(double %a) nounwind readnone
ret double %call
}
; CHECK-LABEL: test11
; CHECK: vrintx.f32
-define float @test11(float %a) {
+define arm_aapcs_vfpcc float @test11(float %a) {
entry:
- %call = call float @rintf(float %a) nounwind readnone
+ %call = call arm_aapcs_vfpcc float @rintf(float %a) nounwind readnone
ret float %call
}
; CHECK-LABEL: test12
-; SP: b rint
+; SP: bl rint
; DP: vrintx.f64
-define double @test12(double %a) {
+define arm_aapcs_vfpcc double @test12(double %a) {
entry:
- %call = call double @rint(double %a) nounwind readnone
+ %call = call arm_aapcscc double @rint(double %a) nounwind readnone
ret double %call
}
-declare float @floorf(float) nounwind readnone
-declare double @floor(double) nounwind readnone
-declare float @ceilf(float) nounwind readnone
-declare double @ceil(double) nounwind readnone
-declare float @roundf(float) nounwind readnone
-declare double @round(double) nounwind readnone
-declare float @truncf(float) nounwind readnone
-declare double @trunc(double) nounwind readnone
-declare float @nearbyintf(float) nounwind readnone
-declare double @nearbyint(double) nounwind readnone
-declare float @rintf(float) nounwind readnone
-declare double @rint(double) nounwind readnone
+declare arm_aapcs_vfpcc float @floorf(float) nounwind readnone
+declare arm_aapcscc double @floor(double) nounwind readnone
+declare arm_aapcs_vfpcc float @ceilf(float) nounwind readnone
+declare arm_aapcscc double @ceil(double) nounwind readnone
+declare arm_aapcs_vfpcc float @roundf(float) nounwind readnone
+declare arm_aapcscc double @round(double) nounwind readnone
+declare arm_aapcs_vfpcc float @truncf(float) nounwind readnone
+declare arm_aapcscc double @trunc(double) nounwind readnone
+declare arm_aapcs_vfpcc float @nearbyintf(float) nounwind readnone
+declare arm_aapcscc double @nearbyint(double) nounwind readnone
+declare arm_aapcs_vfpcc float @rintf(float) nounwind readnone
+declare arm_aapcscc double @rint(double) nounwind readnone
+
diff --git a/llvm/test/CodeGen/ARM/tail-call-builtin.ll b/llvm/test/CodeGen/ARM/tail-call-builtin.ll
index c829cc52462..0ed15bc8403 100644
--- a/llvm/test/CodeGen/ARM/tail-call-builtin.ll
+++ b/llvm/test/CodeGen/ARM/tail-call-builtin.ll
@@ -1,37 +1,38 @@
; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s
-define i64 @test_mismatched_call(double %in) {
+define arm_aapcs_vfpcc i64 @test_mismatched_call(double %in) {
; CHECK-LABEL: test_mismatched_call:
-; CHECK: bl floor
; CHECK: vmov r0, r1, d0
+; CHECK: bl floor
- %val = tail call double @floor(double %in)
+ %val = tail call arm_aapcscc double @floor(double %in)
%res = bitcast double %val to i64
ret i64 %res
}
-define double @test_matched_call(double %in) {
+define arm_aapcs_vfpcc double @test_matched_call(double %in) {
; CHECK-LABEL: test_matched_call:
-; CHECK: b floor
+; CHECK: b _floor
- %val = tail call double @floor(double %in)
+ %val = tail call arm_aapcs_vfpcc double @_floor(double %in)
ret double %val
}
-define void @test_irrelevant_call(double %in) {
+define arm_aapcs_vfpcc void @test_irrelevant_call(double %in) {
; CHECK-LABEL: test_irrelevant_call:
; CHECK-NOT: bl floor
- %val = tail call double @floor(double %in)
+ %val = tail call arm_aapcscc double @floor(double %in)
ret void
}
-define arm_aapcscc double @test_callingconv(double %in) {
+define arm_aapcs_vfpcc double @test_callingconv(double %in) {
; CHECK: test_callingconv:
; CHECK: bl floor
- %val = tail call double @floor(double %in)
+ %val = tail call arm_aapcscc double @floor(double %in)
ret double %val
}
-declare double @floor(double) nounwind readonly
+declare arm_aapcs_vfpcc double @_floor(double) nounwind readonly
+declare arm_aapcscc double @floor(double) nounwind readonly
OpenPOWER on IntegriCloud