summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2017-02-23 22:35:00 +0000
committerTim Northover <tnorthover@apple.com>2017-02-23 22:35:00 +0000
commit063a56e81c89dfbf7896c71c8cd849b911eb7098 (patch)
tree1aab79ee7cf41c79efcf2d847aff161623d3c925 /llvm/test/CodeGen/ARM
parent5cd9a9bf8c1859fcc8f67bcb2e73e0da1ee4d72c (diff)
downloadbcm5719-llvm-063a56e81c89dfbf7896c71c8cd849b911eb7098.tar.gz
bcm5719-llvm-063a56e81c89dfbf7896c71c8cd849b911eb7098.zip
ARM: make sure FastISel bails on f64 operations for Cortex-M4.
FastISel wasn't checking the isFPOnlySP subtarget feature before emitting double-precision operations, so it got completely invalid CodeGen for doubles on Cortex-M4F. The normal ISel testing wasn't spectacular either so I added a second RUN line to improve that while I was in the area. llvm-svn: 296031
Diffstat (limited to 'llvm/test/CodeGen/ARM')
-rw-r--r--llvm/test/CodeGen/ARM/fp-only-sp.ll62
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/fp-only-sp.ll b/llvm/test/CodeGen/ARM/fp-only-sp.ll
new file mode 100644
index 00000000000..2c7b2acbde9
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/fp-only-sp.ll
@@ -0,0 +1,62 @@
+; RUN: llc -mtriple=thumbv7em-apple-macho -mcpu=cortex-m4 %s -o - -O0 | FileCheck %s
+; RUN: llc -mtriple=thumbv7em-apple-macho -mcpu=cortex-m4 %s -o - | FileCheck %s
+
+; Note: vldr and vstr really do have 64-bit variants even with fp-only-sp
+define void @test_load_store(double* %addr) {
+; CHECK-LABEL: test_load_store:
+; CHECK: vldr [[TMP:d[0-9]+]], [r0]
+; CHECK: vstr [[TMP]], [r0]
+ %val = load volatile double, double* %addr
+ store volatile double %val, double* %addr
+ ret void
+}
+
+define void @test_cmp(double %l, double %r, i1* %addr.dst) {
+; CHECK-LABEL: test_cmp:
+; CHECK: bl ___eqdf2
+ %res = fcmp oeq double %l, %r
+ store i1 %res, i1* %addr.dst
+ ret void
+}
+
+define void @test_ext(float %in, double* %addr) {
+; CHECK-LABEL: test_ext:
+; CHECK: bl ___extendsfdf2
+ %res = fpext float %in to double
+ store double %res, double* %addr
+ ret void
+}
+
+define void @test_trunc(double %in, float* %addr) {
+; CHECK-LABEL: test_trunc:
+; CHECK: bl ___truncdfsf2
+ %res = fptrunc double %in to float
+ store float %res, float* %addr
+ ret void
+}
+
+define void @test_itofp(i32 %in, double* %addr) {
+; CHECK-LABEL: test_itofp:
+; CHECK: bl ___floatsidf
+ %res = sitofp i32 %in to double
+ store double %res, double* %addr
+; %res = fptoui double %tmp to i32
+ ret void
+}
+
+define i32 @test_fptoi(double* %addr) {
+; CHECK-LABEL: test_fptoi:
+; CHECK: bl ___fixunsdfsi
+ %val = load double, double* %addr
+ %res = fptoui double %val to i32
+ ret i32 %res
+}
+
+define void @test_binop(double* %addr) {
+; CHECK-LABEL: test_binop:
+; CHECK: bl ___adddf3
+ %in = load double, double* %addr
+ %res = fadd double %in, %in
+ store double %res, double* %addr
+ ret void
+}
OpenPOWER on IntegriCloud